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,这是数据模型的非规范化,它将在查询时为您节省一个“连接”,但会占用更多的存储空间,因此在执行此操作之前,如果您确实需要,最好对其进行基准测试。