gpt4 book ai didi

python - 通过抽象模型的模型

转载 作者:太空宇宙 更新时间:2023-11-04 03:28:54 26 4
gpt4 key购买 nike

我有一个抽象模型:

class Distributor(models.Model):

class Meta:
abstract = True

和继承它的 2 个模型:

class DistributorGroup(Distributor):
pass

class DistributorPerson(Distributor):
pass

我还有一个链接模型:

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')

一个链接可以与其中一个分销商有关系。我通过添加 2 m2m 并将 blank=True 设置为两者来完成此行为。

现在我意识到我需要一个through 模型来连接DistributorLink。但是由于 through 模型不能将抽象模型作为外键,我不知道该怎么做。我是否需要为 DistributorPersonDistributorGroup 创建 2 个单独的 through 模型,或者有一种方法可以通过 1 个 through模型。我也不知道我在 Link 模型中的 2 m2m 是否是实现我想要的行为的正确方法。

所以我想知道用抽象模型组织这些 m2m 模型的方法是什么。

最佳答案

第一个问题是DistributorPersonDistributorGroup 是否真的需要单独的表。如果它们非常相似,那么只使用一个表可能是有意义的。 (例如,如果您要为电话号码建模,您可能不会使用单独的 Home、Work 和 Mobile 表,而是使用带有类型字段的单个表。)

(请注意,您可以使用 proxy models 来允许不同的 Django 模型共享同一个数据库表。)

如果您确实需要单独的表,那么您可以查看 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 表。

请注意,这些都与抽象模型无关。抽象模型只是 Django 中代码重用的一种机制,它们不会影响表或您在其上运行的查询。

关于python - 通过抽象模型的模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31929985/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com