前言:我有两个模型(Product
和UserProfile
),我将实施一个地雷评论系统。评论与对象Product
或UserProfile
相关。
class Product(models.Model):
name = models.CharField(max_length = 40)
comments = models.ManyToMany(Comment)
class UserProfile(models.Model):
user = models.ForeignKey(User, unique = True)
comments = models.ManyToMany(Comment)
class Comment(models.Model):
text = models.TextField()
author = models.ForeignKey(User)
timestamp = models.DateTimeField(auto_now_add = True)
这些模型下的逻辑是否正确?我很怀疑,因为这种方式意味着Product
可以有很多评论(并且它是正确的)但是Comment
可以有很多产品(我认为它不正确)。
不是吗?
答案 0 :(得分:3)
您的评论应该具有UserProfile或Product的ForeignKey,即单个评论只能属于单个产品或用户个人资料,但用户个人资料/产品可以有许多不同的评论
def Comment(models.Model):
profile = models.ForeignKey(UserProfile)
product = models.ForeignKey(Profile)
显然这并不理想,因为您需要管理两种关系,有时您只想使用一种等等。
要克服这个问题,您可以使用通用外键:
https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#generic-relations
这允许您将评论链接到任何类型的内容(产品,用户配置文件等),而无需预先指定模型
def Comment(models.Model):
...
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')