从this one之类的问题中,我知道在django中制作可选外键的推荐方法是设置null=True, blank=True
。这样,就不必设置外键的值。
如果在模型中经常使用外键,这对我来说似乎很好。但是如果大多数外键都是空值,那么这不会违反first normal form并造成大量浪费空间吗?
当然,数据库may be controversial中的空值主题,但我仍然想知道如果我知道外键是稀疏的,我应该如何在Django中设置可选的外键。 Django是否已将此考虑在内?我应该为这种关系创建一个单独的模型吗?在Django的设计中是否已经考虑到了这一点?
感谢。
答案 0 :(得分:1)
你可以使用第三个表来模拟可以为空的外键:
class City(models.Model):
name = models.CharField(max_length=80)
class Person(models.Model):
name = models.CharField(max_length=80)
class PersonCity(models.Model):
person = models.ForeignKey(Person, unique=True)
city = models.ForeignKey(City)
这样,您只会在表PersonCity
中为已知City
的人创建一行。要访问某个城市,您可以使用:
city = person.personcity_set().first().city
你可以创建一个自定义管理器来缩短这个语法,并检查一个我没有举例说明的空personcity_set
,但我个人认为创建一个可以为空的外键仍然更容易阅读和调试。