通过抽象模型的模型
through model for an Abstract model
我有一个抽象模型:
class Distributor(models.Model):
class Meta:
abstract = True
和继承它的 2 个模型:
class DistributorGroup(Distributor):
pass
class DistributorPerson(Distributor):
pass
我也有一个llink型号:
class Link(models.Model):
distributors_persons = models.ManyToManyField(
'people.DistributorPerson', blank=True, related_name='distributors_persons_of_links')
distributors_groups = models.ManyToManyField(
'groups.DistributorGroup', blank=True, related_name='distributors_groups_of_links')
A link 可以与其中一个分销商有关系。我通过添加 2 m2m 并将 blank=True
设置为两者来完成此行为。
现在我意识到我需要一个 through
模型来连接 Distributor
和 Link
。但是由于 through
模型不能将抽象模型作为外键,我不知道该怎么做。我是否需要为 DistributorPerson
和 DistributorGroup
创建 2 个单独的 through
模型,或者有一种方法可以使用 1 个 through
模型来完成此操作。我也不知道 Link
模型中的 2 m2m 是否是实现我想要的行为的正确方法。
所以我想知道用抽象模型组织这些m2m模型的方法是什么。
第一个问题是DistributorPerson
和DistributorGroup
是否真的需要分开table。如果它们非常相似,那么只使用一个 table 可能是有意义的。 (例如,如果您正在建模 phone 数字,您可能不会使用单独的家庭、工作和移动 table,而是使用带有类型字段的单个 table .)
(请注意,您可以使用 proxy models 来允许不同的 Django 模型共享同一个数据库 table。)
如果您确实需要单独的 table,那么您可以查看 GenericForeignKey
。这是一种允许外键引用来自不同模型类型的对象的机制。在您的情况下,这可能看起来像:
class DistributorGroup(Distributor):
distributor_links = GenericRelation(DistributorLink, related_query_name="distributor_groups")
class DistributorPerson(Distributor):
distributor_links = GenericRelation(DistributorLink, related_query_name="distributor_persons")
class Link(models.Model):
pass
class DistributorLink(models.Model):
link = models.ForeignKey(Link);
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
有关示例和更多详细信息,请参阅 generic relations 上的文档。
最后,如果所有其他方法都失败了,您确实可以为这两种关系创建两个单独的 M2M table。
请注意 none 这确实与抽象模型有关。抽象模型只是 Django 中代码重用的一种机制,它们不会影响 table 或您对它们 运行 的查询。
我有一个抽象模型:
class Distributor(models.Model):
class Meta:
abstract = True
和继承它的 2 个模型:
class DistributorGroup(Distributor):
pass
class DistributorPerson(Distributor):
pass
我也有一个llink型号:
class Link(models.Model):
distributors_persons = models.ManyToManyField(
'people.DistributorPerson', blank=True, related_name='distributors_persons_of_links')
distributors_groups = models.ManyToManyField(
'groups.DistributorGroup', blank=True, related_name='distributors_groups_of_links')
A link 可以与其中一个分销商有关系。我通过添加 2 m2m 并将 blank=True
设置为两者来完成此行为。
现在我意识到我需要一个 through
模型来连接 Distributor
和 Link
。但是由于 through
模型不能将抽象模型作为外键,我不知道该怎么做。我是否需要为 DistributorPerson
和 DistributorGroup
创建 2 个单独的 through
模型,或者有一种方法可以使用 1 个 through
模型来完成此操作。我也不知道 Link
模型中的 2 m2m 是否是实现我想要的行为的正确方法。
所以我想知道用抽象模型组织这些m2m模型的方法是什么。
第一个问题是DistributorPerson
和DistributorGroup
是否真的需要分开table。如果它们非常相似,那么只使用一个 table 可能是有意义的。 (例如,如果您正在建模 phone 数字,您可能不会使用单独的家庭、工作和移动 table,而是使用带有类型字段的单个 table .)
(请注意,您可以使用 proxy models 来允许不同的 Django 模型共享同一个数据库 table。)
如果您确实需要单独的 table,那么您可以查看 GenericForeignKey
。这是一种允许外键引用来自不同模型类型的对象的机制。在您的情况下,这可能看起来像:
class DistributorGroup(Distributor):
distributor_links = GenericRelation(DistributorLink, related_query_name="distributor_groups")
class DistributorPerson(Distributor):
distributor_links = GenericRelation(DistributorLink, related_query_name="distributor_persons")
class Link(models.Model):
pass
class DistributorLink(models.Model):
link = models.ForeignKey(Link);
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
有关示例和更多详细信息,请参阅 generic relations 上的文档。
最后,如果所有其他方法都失败了,您确实可以为这两种关系创建两个单独的 M2M table。
请注意 none 这确实与抽象模型有关。抽象模型只是 Django 中代码重用的一种机制,它们不会影响 table 或您对它们 运行 的查询。