Все мои поля manytomany в Django помечены как уникальные, есть ли возможность удалить это?

Учитывая такую ​​модель:

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>]

person Gordon Wrigley    schedule 28.02.2010    source источник


Ответы (2)


Вы можете создать третью таблицу:

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

Я считаю, что это позволит вам создать любое количество отношений между экземплярами A и B.

person Michael Williamson    schedule 28.02.2010
comment
хорошо, это имеет смысл, но у меня есть несколько мест, где это происходит, поэтому, если есть способ сделать это без ручного создания таблиц отношений, то это было бы предпочтительнее. - person Gordon Wrigley; 28.02.2010

Определение отношения ManyToMany в реляционном контексте состоит в том, что оно представляет функцию на подмножестве произведения двух исходных пространств. Таким образом, для каждой пары сущностей существует не более одного отношения в M2M, связывающего пару.

Все основные генераторы схемы ORM фактически создают составной PK или UniqueKey поверх таблицы соединения, чтобы заставить это.

Если вы хотите обойти это, вам следует избегать использования ManyToMany и использовать явную таблицу для объединения.

person rewritten    schedule 31.12.2010