Многие поля Django помечены как уникальные, есть ли возможность удалить это? - PullRequest
2 голосов
/ 28 февраля 2010

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

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 ]

2 голосов
/ 28 февраля 2010

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

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

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

0 голосов
/ 31 декабря 2010

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

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

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

...