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