Django AttributeError при попытке сохранить экземпляр модели - PullRequest
2 голосов
/ 11 февраля 2020

У меня есть следующий код в моей 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 с параметром choices, но в этом случае я получаю только ту же ошибку, но с 'int' вместо 'str'.

1 Ответ

3 голосов
/ 11 февраля 2020

Вы определили поле с именем _state, которое противоречит атрибуту _state класса models.Model.

Поэтому измените ваше поле _state на другое имя.
ex:

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

Ссылка : Django: Какова роль ModelState?

...