首页 > 解决方案 > Django AttributeError 尝试保存模型实例

问题描述

我的 Django 模型中有以下代码:

from __future__ import annotations
from typing import Tuple, List, Dict, Callable
from datetime import date
from django.contrib.auth.models import User
from django.db.models import Model, ForeignKey, CASCADE, CharField, TextField, DateField
from enum import Enum

class RequestState(Enum):
    OPEN = 'OPEN'
    ACCEPTED = 'ACC'
    DECLINED = 'DEC'
    DELETED = 'DEL'

_state_parser: Dict[str, RequestState] = {
    "OPEN": RequestState.OPEN,
    "ACC": RequestState.ACCEPTED,
    "DEC": RequestState.DECLINED,
    "DEL": RequestState.DELETED
}

class ActionRequest(Model):
    issuer = ForeignKey(User, on_delete=CASCADE, null=False, related_name="issuer")
    receiver = ForeignKey(User, on_delete=CASCADE, null=False, related_name="receiver")
    _state = CharField(max_length=4, default=RequestState.OPEN.value, null=False)
    action = TextField(null=False)
    issue_date = DateField(null=False, default=date.today)
    last_change_date = DateField(null=False, default=date.today)

    class InvalidRequestStateException(Exception):

        def __init__(self, request: ActionRequest):
            self.request = request
            super(str(self))

        def __str__(self):
            return f'ActionRequest is in invalid state: {self.request.state}'

    @property
    def state(self) -> RequestState:
        return _state_parser[self._state]

    @state.setter
    def state(self, state: RequestState) -> None:
        self._state = state.value

当我尝试创建一个新模型实例并像这样保存它时:

action_request = ActionRequest(
            issuer=user,
            receiver=receiver,
            action=action
        )
action_request.save()

我收到以下错误:

  File ~\app\views\action_request_view.py", line 53, in post
    action_request.save()
  File "~\venv\lib\site-packages\django\db\models\base.py", line 678, in save
    if field.is_relation and field.is_cached(self):
  File "~\venv\lib\site-packages\django\db\models\fields\mixins.py", line 20, in is_cached
    return self.get_cache_name() in instance._state.fields_cache
AttributeError: 'str' object has no attribute 'fields_cache'

我正在使用 Django3.0。我已经尝试过使用 AcrionRequest.objects.create,以及将 _state 字段更改为带有选择参数的 IntegerField,但在这种情况下,我只会得到相同的错误,但使用 'int' 而不是 'str'。

标签: pythondjangodjango-rest-framework

解决方案


您定义了一个名为的字段,该字段与类的属性_state冲突。_statemodels.Model

因此,将您的_state字段更改为其他名称。
前任:

class ActionRequest(Model):
    # other fields
    state = CharField(max_length=4, default=RequestState.OPEN.value, null=False)

参考Django:ModelState的作用是什么?


推荐阅读