【问题标题】:Django AttributeError on trying to save instance of ModelDjango AttributeError 尝试保存模型实例
【发布时间】:2020-02-11 14:36:43
【问题描述】:

我的 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'。

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

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

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

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

    参考Django : What is the role of ModelState?

    【讨论】:

    • 非常感谢!它立即起作用。我应该尝试重命名该字段,因为我已经尝试了其他所有方法。我向你鞠躬!
    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    相关资源
    最近更新 更多