Django内容类型模型的设计和要求

时间:2016-06-17 17:04:01

标签: django django-models django-contenttypes

我有三种不同的模式(工作,招标,新闻)。

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),这样无论何时创建新对象(作业或招标或新闻),都应该创建一个新的帖子对象,基本上这将使用信号完成。

现在有了这个帖子类

  1. 我想使用创建作业/投标/新闻对象的用户进行过滤。
  2. 还使用作业/投标/新闻对象中使用的标签进行过滤。
  3. 按pub_date排序。
  4. 我对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类?

1 个答案:

答案 0 :(得分:0)

来自Django documentation

  

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

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