Джанго ссылается на экземпляры той же модели в абстрактной модели
У меня есть абстрактная модель, от которой унаследованы несколько моих основных моделей. Основная трудность в этом случае заключается в том, что мне нужно ссылаться на одну и ту же модель, например ForeignKey
в self
, Я прочитал, что ForeignKey
не возможно в абстрактных моделях и GenericForeignKey
могу помочь, однако я не могу заставить его работать.
Как я понимаю, структура должна выглядеть примерно так:
class BaseModel(models.Model):
versions = GenericRelation('self')
date_created = models.DateTimeField(default=datetime.datetime.now)
is_deleted = models.BooleanField(default=False)
content_type = models.ForeignKey(ContentType, blank=True, null=True)
object_id = models.PositiveIntegerField(blank=True, null=True)
content_object = GenericForeignKey('content_type', 'object_id')
class FirstModel(BaseModel):
some_fields...
class AnotherModel(BaseModel):
another_fields...
Но при таком подходе я получаю ошибку:
>>> item1 = FirstModel.objects.get(id=1)
>>> item2 = FirstModel.objects.get(id=2)
>>> item2.content_object = item1
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "/home/michael/.virtualenvs/diagspecgen/lib/python3.6/site-packages/django/contrib/contenttypes/fields.py", line 245, in __set__
ct = self.get_content_type(obj=value)
File "/home/michael/.virtualenvs/diagspecgen/lib/python3.6/site-packages/django/contrib/contenttypes/fields.py", line 163, in get_content_type
return ContentType.objects.db_manager(obj._state.db).get_for_model(
AttributeError: 'ReverseGenericRelatedObjectsDescriptor' object has no attribute '_state'
Разве то, что я пытаюсь достичь, абсолютно невозможно, и единственное решение - явно создать необходимые поля в существующих моделях?
Спасибо за ваши предложения.
1 ответ
Я пытался повторить вашу проблему с ForeignKey
на абстрактной модели, но, похоже, отлично работает с Django версии 1.11.1:
class BaseModel(models.Model):
other = models.ForeignKey('self', null=True, blank=True)
class Meta:
abstract = True
class FirstModel(BaseModel):
pass
class AnotherModel(BaseModel):
pass
Используя модели:
>>> fm1 = FirstModel.objects.create()
>>> fm2 = FirstModel.objects.create()
>>>
>>> fm1.other = fm2
>>> fm1.save()
Следующее присвоение другим приводит к ошибке:
>>> am = AnotherModel.objects.create()
>>> am.other = fm1
ValueError: Cannot assign "<FirstModel: FirstModel object>": "AnotherModel.other" must be a "AnotherModel" instance.