【发布时间】:2015-03-16 17:34:05
【问题描述】:
当外部表中缺少可选Foreign Key 的相关值时,我可以:
设置为
null指向外部表中的空字符串
''
在我看来,如果您遵循 Django 设计实践,您最终会得到选项 2(参见下面的代码)。这两种方法有什么明显的优点或缺点吗?
Django 在设计/惯例上偏爱2。文档说null 和'' 是“无数据”的两个可能值。因此,如果您省略可选字段,表单将正确验证并提供您的Foreign Key 可以指向的空字符串。
但是从逻辑上讲,缺失值似乎应该暗示null 或缺失Foreign Key(而不是指向空值的有效Foreign Key)。
此外,如果我只是列出所有专辑或进行计数,存储空白将是一个问题。每次我都要记住避免空字符串。相反,null 外键在专辑表中永远不会有条目。
参考:
带有代码的可选细节:
#models.py
class Album(Model):
name = CharField(max_length=50, unique=True)
class Song(Model):
name = CharField(max_length=50)
album = ForeignKey(Album, null=True, blank=True)
#forms.py
class SongForm(Form):
name = CharField(max_length=50)
album = CharField(max_length=50, required=False)
如果您有一首没有专辑名称的歌曲,表单将返回{'name':'foo', 'album':''}。这会在 Album 表中创建一个名称为空的条目。我可以在视图中规避它(参见下面的代码)。但这似乎是一种 hack,因为数据验证应该在表单中完成。
if album:
Song.objects.create(name=form.cleaned_data['name'], album=form.cleaned_data['album'])
else:
Song.objects.create(name=form.cleaned_data['name'], album_id=None)
【问题讨论】:
标签: django database django-models