如果您有一个要确保至少具有一个 FK 关系的模型,并且您不想使用null=False
,因为这需要设置默认 FK(这将是垃圾数据),那么我想出的最佳方法是添加自定义.clean()
和.save()
方法。.clean()
引发验证错误,并.save()
调用 clean。这样,表单和其他调用代码、命令行和测试都可以强制执行完整性。如果没有这个,(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