python - 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'。
解决方案
您定义了一个名为的字段,该字段与类的属性_state
冲突。_state
models.Model
因此,将您的_state
字段更改为其他名称。
前任:
class ActionRequest(Model):
# other fields
state = CharField(max_length=4, default=RequestState.OPEN.value, null=False)