首页 > 解决方案 > Django - 模型混合没有按预期工作

问题描述

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为许多模型指定相同的内容,因此我决定为此创建一个 mixin(那里也有几种方法,但现在没关系)。

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用于此目的吗?

标签: pythondjangodjango-modelsmixinsdjango-2.1

解决方案


你的 mixin 必须是抽象的,继承应该来自 models.Model 我认为。

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

    class Meta:
        abstract = True

推荐阅读