按通用外键的Django顺序

2024-05-19 03:21:57 发布

您现在位置:Python中文网/ 问答频道 /正文

嘿,这个很快。我有两个模型,Post和Term,我希望能够标记和分类(分类法)帖子以及其他(未来)模型。我的Post模型有以下字段:title、content、published(date),我的任期是这样声明的:

class Term(models.Model):
    taxonomy = models.CharField(max_length=255)
    name = models.CharField(max_length=255)
    slug = models.SlugField(max_length=50)

然后我有一个TermRelationship模型,它将术语粘贴到post和其他模型上,如下所示:

^{pr2}$

一切如期进行,但我的问题如下。我想创建一个特定类别的文章存档,并按发布日期排序。这就是我要做的:

ctype = ContentType.objects.get_for_model(Post)
relations = TermRelation.objects.filter(content_type__pk=ctype.id)

它工作得很好,虽然我猜是按关系PK排序的。当我尝试执行以下操作时:

relations = TermRelation.objects.filter(content_type__pk=ctype.id).order_by('content_object__published')

我得到一个错误,说在termlession中没有content_object字段。我知道一定有办法解决它。有什么想法吗?在

谢谢~K


Tags: 模型objects排序modelscontentfilterctypepost
2条回答

是的,我对带有连接的简单SQL查询是非常正确的。实际上有一些加入。以下是对我有效的方法(django>;=1.2用于raw()方法)

data = {
    'posts': Post._meta.db_table,
    'relations': TermRelation._meta.db_table,
    'terms': Term._meta.db_table,
    'tag_id': tag.id
}

posts = Post.objects.raw('SELECT %(posts)s.* FROM %(posts)s JOIN %(relations)s ON %(posts)s.id = %(relations)s.object_id JOIN %(terms)s ON %(relations)s.term_id = %(terms)s.id WHERE %(terms)s.id = %(tag_id)s ORDER BY %(posts)s.published DESC' % data)

没那么难。也许我应该用术语关系的方法来总结,你觉得呢?在

更新:我确实把它包装成一个静态方法,使它更通用,可以处理不同的内容类型和排序顺序。它仍然假设存在一个名为content_type_id的字段,如果ContentType上有外键,则默认创建该字段。代码如下:

^{pr2}$

据我所知,对于django,这是不可能的,因为order_by-参数被转换为数据库列/表,content_object不会像这样在数据库中退出。这也是您必须使用object_id/content_type执行内容类型查找的原因。。。在

相关问题 更多 >

    热门问题