добавление того же объекта дважды к ManyToManyField

Запишите модульные тесты на вещи, которые Вы ожидаете повреждать, и на пограничные случаи. После этого тестовые сценарии должны быть добавлены, поскольку отчеты об ошибках входят - прежде, чем записать фиксацию для ошибки. Разработчик может тогда быть уверен что:

  1. ошибка исправлена;
  2. ошибка не вновь появится.

На присоединенный комментарий - я предполагаю этот подход к записи, что модульные тесты могли вызвать проблемы, если много ошибок, со временем, обнаруживается в данном классе. Это, вероятно, где усмотрение полезно - добавляющие модульные тесты только на ошибки, которые, вероятно, будут повторяться, или где их повторение вызвало бы серьезные проблемы. Я нашел, что мера интеграционного тестирования в модульных тестах может быть полезной в этих сценариях - тестирующий код выше, пути выполнения кода могут покрыть пути выполнения кода, опускаются.

7
задан qollin 13 September 2009 в 14:58
поделиться

3 ответа

Я думаю, что вы хотите использовать промежуточную модель для формирования отношения M2M с использованием аргумента ключевого слова - в ManyToManyField . Вроде как первый ответ выше, но больше «Django-y».

class A(models.Model):
    name = models.CharField(max_length=200)

class B(models.Model):
    a = models.ManyToManyField(A, through='C')
    ...

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

При использовании ключевого слова с по обычные методы манипуляции M2M больше не доступны (это означает add , создать , удалить или присвоение с помощью оператора = ). Вместо этого вы должны создать саму промежуточную модель, например:

 >>> C.objects.create(a=a1, b=b)

Однако, вы по-прежнему сможете использовать обычные операции запросов к модели, содержащей ManyToManyField . Другими словами, следующее будет работать:

 >>> b.a.filter(a=a1)

Но, возможно, лучший пример - это что-то вроде этого:

>>> B.objects.filter(a__name='Test')

Пока поля FK в промежуточной модели не обозначены как уникальные , вы сможете для создания нескольких экземпляров с одинаковыми FK. Вы также можете прикрепить дополнительную информацию об отношениях, добавив любые другие поля, которые вам нравятся, в C .

Промежуточные модели описаны здесь .

>>> B.objects.filter(a__name='Test')

Пока поля FK в промежуточной модели не обозначены как уникальные , вы сможете создать несколько экземпляров с одними и теми же FK. Вы также можете прикрепить дополнительную информацию об отношениях, добавив любые другие поля, которые вам нужны, в C .

Промежуточные модели описаны здесь .

>>> B.objects.filter(a__name='Test')

Пока поля FK в промежуточной модели не обозначены как уникальные , вы сможете создать несколько экземпляров с одними и теми же FK. Вы также можете прикрепить дополнительную информацию об отношениях, добавив любые другие поля, которые вам нравятся, в C .

Промежуточные модели описаны здесь .

4
ответ дан 7 December 2019 в 07:48
поделиться

Django использует реляционную БД для своего базового хранилища, и это внутренне ДЕЙСТВИТЕЛЬНО имеет "семантику установки": нет способа обойти ЭТО. Так что, если вам нужен «множественный набор» чего-либо, вы должны представить это числовым полем, которое подсчитывает, сколько раз каждый элемент «встречается». ManyToManyField этого не делает - поэтому вместо этого вам понадобится отдельный подкласс Model, который явно указывает A и B, которые он связывает, И имеет целочисленное свойство, чтобы «подсчитать, сколько раз».

3
ответ дан 7 December 2019 в 07:48
поделиться

Один из способов сделать это:

class A(models.Model):
    ...

class B(models.Model):
    ...

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

Затем:

>>> a1 = A()
>>> a2 = A()
>>> b = B()
>>> c1 = C(a=a1, b=b)
>>> c2 = C(a=a2, b=b)
>>> c3 = C(a=a1, b=b)

Итак, у нас просто есть:

>>> assert C.objects.filter(b=b).count == 3
>>> for c in C.objects.filter(b=b):
...     # do something with c.a
0
ответ дан 7 December 2019 в 07:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: