我们假设我有书籍和评论,我也有评论可以与书籍或评论相关,但同时不是两者都有,我应该如何设计我的数据库呢?我想我可以这样做,但随后评论可以与书籍和评论相关......:
class Book(models.Model):
title = models.CharField(max_length=100)
class Review(models.Model):
review = models.TextField()
class Comment(models.Model):
book = models.ForeignKey(null=True)
review = models.ForeignKey(null=True)
答案 0 :(得分:0)
嗯,GenericForeignKey是正式的做法,但GenericForeignKey很糟糕。
是的,不是根据那个描述,但它很糟糕。所以你的方法并不是一个好主意。您有两种不同的方法来强制执行约束。第一个是在数据库级别,并且将是100%万无一失的,即创建一个ON INSERT TRIGGER,它将检查两个字段中的任何一个是否为空。正常的ForeignKey只能“指向”另一个模型,这意味着 如果TaggedItem模型使用ForeignKey,则必须选择 一个且只有一个模型来存储标签。 contenttypes应用程序 提供了一种特殊的字段类型(GenericForeignKey) 这允许关系与任何模型:
第二种方法是覆盖模型中的save方法。
def save(self, *args, **kwargs):
if self.book and self.review:
raise ValueError('Hey you cant do that')
else:
Super(Comment, self).save(*args, **kwargs)