我有一个带有Person模型的Django模型:
class Person(models.Model):
# Personal details
first_name = models.CharField(max_length=50)
middle_name = models.CharField(max_length=50, blank=True, null=True)
last_name = models.CharField(max_length=50)
gender = models.CharField(max_length=1, choices=GENDER_CHOICES)
date_of_birth = models.DateField()
# Address
street_address = models.CharField(max_length=50)
suburb = models.CharField(max_length=30)
postcode = models.CharField(max_length=4)
state = models.CharField(max_length=3, choices=STATE_CHOICES)
#Contact Details
email = models.EmailField()
# Family
spouse = models.ForeignKey('self', null=True, blank=True)
children = models.ManyToManyField('self', null=True, blank=True)
home_church = models.ForeignKey('Church', null=True, blank=True)
“middle_name”字段可以为空,我认为没有办法避免这种情况,是吗?
但是,我的配偶也有一个可以为null的ForeignKey,为他们的孩子提供一个递归的ManyToManyField,为教堂设置一个可以为null的ForeignKey(如果相关)。
我的问题 - 首先,目前对可空外键的共识是什么?我应该在这里允许它,还是应该创建某种“无人”或“未分配”模式来代表没有配偶/家庭教会?
还是有其他方法可以在Django中重新设计这个设计以适应这个吗?
如果我继续使用null FK,那么Django中是否有任何需要注意的注意事项? (左连接?)
干杯, 维克多
答案 0 :(得分:0)
Null非常好。在python代码None
中将代表Null
。
你应该知道的一件重要事情是,如果你删除教堂,django会执行级联,你教会的人也会被删除。因此,在删除教堂之前,你需要为教堂里的每个人在教堂场地上设置Null。
Django 1.3引入了on_delete参数,这使得这很简单。
答案 1 :(得分:0)
大多数DBMS实现的可空外键在逻辑上没有多大意义。不同DBMS处理它们的方式之间也存在一些不一致。因此,可以为空的外键很可能导致错误的结果。只需将有问题的属性移动到新表中,并且只有在有值填充该表时填充该表,就可以轻松避免它们。
答案 2 :(得分:0)
当外键标记为null = True时,Django将使用LEFT OUTER JOIN处理JOIN,至少使用Oracle数据库AFAIK,因此没有问题。