【问题标题】:Django content type model design and requirementsDjango 内容类型模型设计和要求
【发布时间】:2016-10-19 14:27:11
【问题描述】:

我有三种不同的模型(Job、Tender、News)。

class Tender(models.Model):
    title = models.CharField(max_length=256)
    description = models.TextField()
    department = models.CharField(max_length=50)
    tags = models.ManyToManyField(Tag)
    pub_date = models.DateTimeField(default=timezone.now)

class Job(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
    title = models.CharField(max_length=256)
    qualification = models.CharField(max_length=256)
    employer = models.CharField(max_length=50)
    salary = models.IntegerField()    
    tags = models.ManyToManyField(Tag)
    pub_date = models.DateTimeField(default=timezone.now)

class News(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
    title = models.CharField(max_length=150)
    body = models.TextField()
    tags = models.ManyToManyField(Tag)
    pub_date = models.DateTimeField(default=timezone.now)

现在我想创建另一个模型(Post 类),这样每当创建一个新对象(工作、招标或新闻)时,就应该创建一个新的 post 对象,基本上这将使用信号来完成。

现在有了这个帖子类

  1. 我想使用创建工作/投标/新闻对象的用户进行过滤。
  2. 还使用 job/tender/news 对象中使用的标签进行过滤。
  3. 按 pub_date 排序。

我对 django 的内容类型非常陌生,对需要哪些字段感到困惑。我只知道这三个字段是必填的,content typeobject idcontent object

class Post(models.Model):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

但是要获得我想要的功能(即过滤和排序依据),我是否必须将 usertagspub_date 字段添加到 Post 类?

【问题讨论】:

    标签: django django-models django-contenttypes


    【解决方案1】:

    来自Django documentation

    由于 GenericForeignKey 的实现方式,你不能使用这样的 直接使用过滤器的字段(例如,filter() 和 exclude())通过 数据库 API。因为 GenericForeignKey 不是普通字段 对象,这些示例将不起作用:

    我相信简短的回答是您需要包含 usertagspub_date 或者更好的是通过 ForeignKey 链接到模型。

    【讨论】:

    • 很抱歉我没有得到“将通过 ForeignKey 链接到模型”。你能详细说明一下吗?谢谢。
    • 抱歉,这并不聪明 - 我相信您还有一个名为 Tag 的模型,因为 tags = models.ManyToManyField(Tag) 所以我只是建议您将用户和标签包含在 Post user = models.ForeignKey(settings.AUTH_USER_MODEL)tags = models.ManyToManyField(Tag)。出于兴趣,你为什么不使用user = models.ForeignKey(User)
    猜你喜欢
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多