Django - 模型混合不按预期工作
Django - model mixin doesn't work as expected
在 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
吗?
你的 mixin 必须是抽象的,继承应该来自 models.Model 我认为。
class PipedriveSyncRelatedMixin(models.Model):
pipedrivesyncs = GenericRelation('pipedrive.PipedriveSync')
class Meta:
abstract = True
在 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
吗?
你的 mixin 必须是抽象的,继承应该来自 models.Model 我认为。
class PipedriveSyncRelatedMixin(models.Model):
pipedrivesyncs = GenericRelation('pipedrive.PipedriveSync')
class Meta:
abstract = True