В PipedriveSync
модели я использую GenericForeignKey
, поэтому любая модель может иметь PipedriveSync
связанный с объектом.
class PipedriveSync(TimeStampedModel):
...
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
И я использую GenericRelation
, чтобы иметь возможность ссылаться назад на этот объект. Например user.pipedrivesyncs.all()
Взгляните на User
class User(AbstractUser):
pipedrivesyncs = GenericRelation('pipedrive.PipedriveSync')
Поскольку мне нужно указать один и тот же pipedrivesyncs
для многих моделей, я решил создать для этого миксин (там тоже есть пара методов, но это не имеет значения).
class PipedriveSyncRelatedMixin():
pipedrivesyncs = GenericRelation('pipedrive.PipedriveSync')
И я использую это так
class User(PipedriveSyncRelatedMixin,AbstractUser):
pass
Проблема в том, что Mixin
не работает так, как работает, когда я вручную задаю pipedrivesyncs.
Случай указания pipedrivesyncs
вручную:
> u = User.objects.first()
> u.pipedrivesyncs.first()
> <PipedriveSync: PipedriveSync object (20)>
Случай при использовании Mixin
> u = User.objects.first()
> u.pipedrivesyncs.first()
> AttributeError: 'GenericRelation' object has no attribute 'first'
В чем разница и могу ли я использовать Mixin
для этой цели?