Вам просто нужна пробная версия, чтобы иметь три ссылки на продукты в любой комбинации двух продуктов теста? Я думаю, что ваши определения модели в порядке, но я бы использовал Trial.clean()
, чтобы проверить, что каждый из (order_1, order_2, order_3) является одним из (product_a, product_b):
def clean(self):
super(Trial, self).clean()
for order in (order_1, order_2, order_3):
if order not in (self.test.product_a, self.test.product_b):
raise ValidationError("Order not one of test's products.")
Теперь, если нет разницы во взаимосвязи между тестом и его product_a и взаимосвязью между этим тестом и его product_b, я думаю, что на самом деле должно быть много ко многим. То же самое касается отношений Пробный продукт. Вы можете проверить, что установленные значения соответствуют вашим критериям. Вы могли бы пойти с чем-то вроде этого:
class Test(models.Model):
products = models.ManyToManyField(Product, related_name='tests')
def clean(self):
super(Test, self).clean()
if self.products.all().count() != 2:
raise ValidationError('Test should have 2 products')
class Trial(models.Model):
test = models.ForeignKey(Test)
orders = models.ManyToManyField(Product, related_name='trials')
def clean(self):
super(Trial, self).clean()
if self.orders.all().count() != 3:
raise ValidationError('Trial should have 3 orders')
for product in self.orders.all():
if product not in self.test.products.all():
raise ValidationError("Order not one of test's products")
Я также изменил ваши связанные имена. Они используются для обратной связи, поэтому для получения проб и тестов, связанных с данным продуктом, вы будете использовать:
product = //some Product
trials = product.trials.all()
tests = product.tests.all()