在Django中,如果大多数外键都是空白,那么设置可选外键的最佳方法是什么?

时间:2015-02-13 13:08:15

标签: django django-models

this one之类的问题中,我知道在django中制作可选外键的推荐方法是设置null=True, blank=True。这样,就不必设置外键的值。

如果在模型中经常使用外键,这对我来说似乎很好。但是如果大多数外键都是空值,那么这不会违反first normal form并造成大量浪费空间吗?

当然,数据库may be controversial中的空值主题,但我仍然想知道如果我知道外键是稀疏的,我应该如何在Django中设置可选的外键。 Django是否已将此考虑在内?我应该为这种关系创建一个单独的模型吗?在Django的设计中是否已经考虑到了这一点?

感谢。

1 个答案:

答案 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,但我个人认为创建一个可以为空的外键仍然更容易阅读和调试。