纠正Django模型的关系

时间:2011-07-16 11:50:09

标签: python django django-models django-orm

前言:我有两个模型(ProductUserProfile),我将实施一个地雷评论系统。评论与对象ProductUserProfile相关。

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可以有很多产品(我认为它不正确)。

不是吗?

1 个答案:

答案 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')