【问题标题】:Correct Django models relationship正确的 Django 模型关系
【发布时间】:2011-07-16 11:50:08
【问题描述】:

前言:我有两个模型(ProductUserProfile),我想实现一个我的 cmets 系统。评论与对象相关,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 可以有很多 cmets(这是正确的),但Comment 可以有很多产品(我不认为这是正确的)。

不是吗?

【问题讨论】:

    标签: python django django-models django-orm


    【解决方案1】:

    您的评论应该具有 UserProfile 或产品的 ForeignKey,即单个评论只能属于单个产品或用户配置文件,但用户配置文件/产品可以有许多不同的 cmets

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

    【讨论】:

    • 或者你可以使用内置的 cmets 框架,它使用泛型关系。
    猜你喜欢
    • 1970-01-01
    • 2017-09-04
    • 2019-04-18
    • 1970-01-01
    • 2017-11-07
    • 2019-07-30
    • 1970-01-01
    • 2014-12-18
    相关资源
    最近更新 更多