代码之家  ›  专栏  ›  技术社区  ›  Gordon Wrigley

我的django manytomy字段都被标记为唯一的,是否有删除此字段的选项?

  •  2
  • Gordon Wrigley  · 技术社区  · 15 年前

    给出这样的模型:

    class A(models.Model):
        def __unicode__(self):
            return "%d"%self.id
    
    class B(models.Model):
        a_set = models.ManyToManyField(A)
    
        def __unicode__(self):
            return "%d"%self.id
    

    接下来的一系列操作说明了我的问题:

    In [1]: a1=A()
    In [2]: a1.save()
    In [3]: a1
    Out[3]: <A: 1>
    
    In [4]: b1=B()
    In [5]: b1.save()
    In [6]: b1
    Out[6]: <B: 1>
    
    In [7]: b2=B()
    In [8]: b2.save()
    In [9]: b2
    Out[9]: <B: 2>
    
    In [10]: a1.b_set.add(b1)
    In [11]: a1.b_set.all()
    Out[11]: [<B: 1>]
    
    In [12]: a1.b_set.add(b2)
    In [13]: a1.b_set.all()
    Out[13]: [<B: 1>, <B: 2>]
    
    In [14]: a1.b_set.add(b2)
    In [15]: a1.b_set.all()
    Out[15]: [<B: 1>, <B: 2>]
    

    最后我想看到的是:

    Out[15]: [<B: 1>, <B: 2>, <B: 2>]
    
    2 回复  |  直到 15 年前
        1
  •  2
  •   Michael Williamson    15 年前

    您可以创建第三个表:

    class JoinModel(models.Model):
        a = models.ForeignKey(A)
        b = models.ForeignKey(B)
    

    我相信这将允许您在a和b的实例之间创建任意数量的关系。

        2
  •  0
  •   rewritten    14 年前

    关系上下文中多人关系的定义是,它表示两个原始空间乘积的子集上的函数。因此,对于每对实体,在m2m中至多有一个关系将其关联起来。

    实际上,所有主要的orm模式生成器都会在连接表上创建一个复合pk或uniquekey来强制执行此操作。

    如果要跳过这个问题,就必须避免使用manytomany,并使用显式表进行连接。