У меня есть следующий код в моей 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'.