Django - модельный миксин не работает должным образом - PullRequest
1 голос
/ 19 марта 2019

В 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 для этой цели?

1 Ответ

1 голос
/ 19 марта 2019

Ваш миксин должен быть абстрактным, а наследственность должна исходить от моделей. Модель, я думаю.

class PipedriveSyncRelatedMixin(models.Model):
    pipedrivesyncs = GenericRelation('pipedrive.PipedriveSync')

    class Meta:
        abstract = True
...