Если у вас есть модель, которую вы хотите гарантировать, чтобы она имела хотя бы одно отношение FK, и вы не хотите использовать null=False
, потому что для этого требуется установить FK по умолчанию (который будет представлять собой данные для мусора), наилучший способпридумали, чтобы добавить пользовательские .clean()
и .save()
методы..clean()
вызывает ошибку проверки, а .save()
вызывает очистку.Таким образом, целостность обеспечивается как из форм, так и из другого вызывающего кода, командной строки и тестов.Без этого (AFAICT) нет способа написать тест, который гарантирует, что модель имеет отношение FK к специально выбранной (не по умолчанию) другой модели.
class Payer(models.Model):
name = models.CharField(blank=True, max_length=100)
# Nullable, but will enforce FK in clean/save:
payer_group = models.ForeignKey(PayerGroup, null=True, blank=True,)
def clean(self):
# Ensure every Payer is in a PayerGroup (but only via forms)
if not self.payer_group:
raise ValidationError(
{'payer_group': 'Each Payer must belong to a PayerGroup.'})
def save(self, *args, **kwargs):
self.full_clean()
return super().save(*args, **kwargs)
def __str__(self):
return self.name