Python Django复杂关系
我有以下几种型号:Python Django复杂关系,python,sql,django,django-models,orm,Python,Sql,Django,Django Models,Orm,我有以下几种型号: class A(models.Model): title = models.CharField(max_length=30) class B(models.Model): title = models.CharField(max_length=255) a = models.ManyToManyField(A) 我现在想要一个模型C,它有一个字段,它有a和B的多个唯一组合,就像在许多字段中一样。我发现可以使用GenericForeignKey将Fo
class A(models.Model):
title = models.CharField(max_length=30)
class B(models.Model):
title = models.CharField(max_length=255)
a = models.ManyToManyField(A)
我现在想要一个模型C,它有一个字段,它有a和B的多个唯一组合,就像在许多字段中一样。我发现可以使用GenericForeignKey将ForeignKey映射到两个模型。我已经尝试过GenericForeignKey,如下所示:
class C(models.Model):
title = models.CharField()
property1 = models.CharField()
a = models.ManyToManyField(A)
b = models.ManyToManyField(B)
a_b = GenericForeignKey(store, category)
但是,这似乎不起作用。有人能给我指出正确的方向吗?我对Django和SQL都是新手
编辑:阐明了组合的要求
编辑2:当前工作模式:
我创建了以下模型作为工作解决方案:
class A(models.Model):
title = models.CharField(max_length=30)
class B(models.Model):
title = models.CharField(max_length=255)
a = models.ManyToManyField(A)
class C(models.Model):
title = models.CharField()
property1 = models.CharField()
class A_B_C(models.Model):
a = models.ForeignKey(A)
b = models.ForeignKey(B)
c = models.ForeignKey(C)
class Meta:
unique_together = ('a', 'b', 'c')
class A(models.Model):
title = models.CharField(max_length=30)
class B(models.Model):
title = models.CharField(max_length=255)
a = models.ManyToManyField(A)
class C(models.Model):
title = models.CharField()
property1 = models.CharField()
class A_B_C(models.Model):
a = models.ForeignKey(A)
b = models.ForeignKey(B)
c = models.ForeignKey(C)
class Meta:
unique_together = ('a', 'b', 'c')
正是这个模型,我避免在关系中显式地创建和维护。我想知道这个解决方案是否有效,或者是否有另一种Django方法来做事情?这不是GenericForeignKey的工作。相反,您需要一起定义
unique\u
Meta属性:
class C(models.Model):
...
class Meta
unique_together = ('a', 'b')
这不是GenericForeignKey的工作。相反,您需要一起定义
unique\u
Meta属性:
class C(models.Model):
...
class Meta
unique_together = ('a', 'b')
使用
ManyToManyField
Django时,会隐式地为您创建中间表。在您的示例中,您将获得包含列(id、a\u id、b\u id)
的附加表。但您可以显式定义它,并在B
模型的a
字段上设置到
选项,然后为该中间模型一起定义unique\u
:
class A(models.Model):
title = models.CharField(max_length=30)
class B(models.Model):
title = models.CharField(max_length=255)
a = models.ManyToManyField(A, through='C')
class C(models.Model):
a = models.ForeignKey(A, on_delete=models.CASCADE)
b = models.ForeignKey(B, on_delete=models.CASCADE)
class Meta:
unique_together = ("a", "b")
注意:如果我没记错的话,您不能直接在
ManyToManyFiled
上一起设置unique_。使用ManyToManyField
Django会隐式为您创建中间表。在您的示例中,您将获得包含列(id、a\u id、b\u id)
的附加表。但您可以显式定义它,并在B
模型的a
字段上设置到
选项,然后为该中间模型一起定义unique\u
:
class A(models.Model):
title = models.CharField(max_length=30)
class B(models.Model):
title = models.CharField(max_length=255)
a = models.ManyToManyField(A, through='C')
class C(models.Model):
a = models.ForeignKey(A, on_delete=models.CASCADE)
b = models.ForeignKey(B, on_delete=models.CASCADE)
class Meta:
unique_together = ("a", "b")
注意:如果我没记错的话,您不能直接在manytomanyfile
上设置unique_。\n供将来参考:
我创建了以下模型作为工作解决方案:
class A(models.Model):
title = models.CharField(max_length=30)
class B(models.Model):
title = models.CharField(max_length=255)
a = models.ManyToManyField(A)
class C(models.Model):
title = models.CharField()
property1 = models.CharField()
class A_B_C(models.Model):
a = models.ForeignKey(A)
b = models.ForeignKey(B)
c = models.ForeignKey(C)
class Meta:
unique_together = ('a', 'b', 'c')
class A(models.Model):
title = models.CharField(max_length=30)
class B(models.Model):
title = models.CharField(max_length=255)
a = models.ManyToManyField(A)
class C(models.Model):
title = models.CharField()
property1 = models.CharField()
class A_B_C(models.Model):
a = models.ForeignKey(A)
b = models.ForeignKey(B)
c = models.ForeignKey(C)
class Meta:
unique_together = ('a', 'b', 'c')
供日后参考:
我创建了以下模型作为工作解决方案:
class A(models.Model):
title = models.CharField(max_length=30)
class B(models.Model):
title = models.CharField(max_length=255)
a = models.ManyToManyField(A)
class C(models.Model):
title = models.CharField()
property1 = models.CharField()
class A_B_C(models.Model):
a = models.ForeignKey(A)
b = models.ForeignKey(B)
c = models.ForeignKey(C)
class Meta:
unique_together = ('a', 'b', 'c')
class A(models.Model):
title = models.CharField(max_length=30)
class B(models.Model):
title = models.CharField(max_length=255)
a = models.ManyToManyField(A)
class C(models.Model):
title = models.CharField()
property1 = models.CharField()
class A_B_C(models.Model):
a = models.ForeignKey(A)
b = models.ForeignKey(B)
c = models.ForeignKey(C)
class Meta:
unique_together = ('a', 'b', 'c')
我试了一下,这里不允许很多人进入。试着了解你在这里真正需要什么。A和B已经通过M2M连接,为什么需要两个额外的M2M?你可能正在寻找一个关于这段关系的答案吗?我试过了,这里不允许有很多人。试着了解你在这里真正需要什么。A和B已经通过M2M连接,为什么需要两个额外的M2M?你可能会在那个关系上寻找a吗?这很有效,但我也需要a,b的多种组合,就像在许多类型的关系中一样。这在这里可能吗?这是一个明确的多对多,但因为你写了“我现在想要一个C模型,它的字段是a和B的唯一组合。”它增加了一个唯一的约束。在上面写的代码中,假设a是a的实例,而bN是B的实例,你可以有,即:(a1-b1,a2-b1,a3-b1,a1-b2,a2-b3,a3-b1,a3-b2,a3-b3)关系,这当然允许反向查找(感谢Django ORM),即(b1-a1、b1-a2、b1-a3等)。但由于在一起是唯一的_,您不能有(a1-b1、a1-b2、a2-b1、a2-b2、a1-b2)。根据您最后的评论,我需要a1-b1、a1-b2可以映射到c1。现在,c1可以有a1-b1或a1-b2。我对问题进行了改进,将此评论包括在内。好吧,这是解决方案之一,您在问题的编辑中包含了这一点。虽然由于您的C模型非常简单,另一种方法是将字段从C直接包含到A_B_C,这是数据模型的非规范化,它将在查询时为您节省一个“连接”,但会占用更多存储空间,因此在执行此操作之前,如果您确实需要,最好对其进行基准测试。这很有效,但我需要A的多个组合,b也是可能的,就像在许多类型的关系中一样。这在这里可能吗?这是一个明确的多对多,但因为你写了“我现在想要一个C模型,它的字段是a和B的唯一组合。”它增加了一个唯一的约束。在上面写的代码中,假设a是a的实例,而bN是B的实例,你可以有,即:(a1-b1,a2-b1,a3-b1,a1-b2,a2-b3,a3-b1,a3-b2,a3-b3)关系,这当然允许反向查找(感谢Django ORM),即(b1-a1、b1-a2、b1-a3等)。但由于在一起是唯一的_,您不能有(a1-b1、a1-b2、a2-b1、a2-b2、a1-b2)。根据您最后的评论,我需要a1-b1、a1-b2可以映射到c1。现在,c1可以有a1-b1或a1-b2。我对问题进行了改进,将此评论包括在内。好吧,这是解决方案之一,您在问题的编辑中包含了这一点。虽然由于您的C模型非常简单,另一种方法是将字段从C直接包含到A_B_C,这是数据模型的非规范化,它将在查询时为您节省一个“连接”,但会占用更多的存储空间,因此在执行此操作之前,如果您确实需要,最好对其进行基准测试。