gpt4 book ai didi

python - Django 按通用外键排序

转载 作者:行者123 更新时间:2023-11-30 23:56:59 25 4
gpt4 key购买 nike

嘿,这很快。我有两个模型,帖子和术语,我希望能够对帖子以及其他( future )模型进行标记和分类(分类)。我的帖子模型具有以下字段:标题、内容、发布(日期),我的术语声明如下:

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

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

class TermRelation(models.Model):
term = models.ForeignKey(Term)
object_id = models.PositiveIntegerField()
content_type = models.ForeignKey(ContentType)
content_object = generic.GenericForeignKey()

一切都按预期进行,但我的问题如下。我想创建某个类别的帖子文件,并按发布日期对帖子进行排序。这就是我正在尝试做的事情:

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

我收到一条错误消息,指出 TermRelation 中没有 content_object 字段。我知道一定有办法解决。有什么想法吗?

谢谢~K

最佳答案

是的,我对带有连接的简单 SQL 查询的看法是完全正确的。实际上有几个加入。这对我有用(raw() 方法的 django >= 1.2)

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)

没那么困难。也许我应该将它包装在 TermRelation 的方法中,你觉得怎么样?

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

@staticmethod
def get_objects_by_term_id(model=None, taxonomy=None, term_id=None, order_by='NULL'):
data = {
'objects': model._meta.db_table,
'content_type': ContentType.objects.get_for_model(model).id,
'relations': TermRelation._meta.db_table,
'terms': Term._meta.db_table,
'term_id': term_id,
'order_by': ' ORDER BY %s ' % order_by
}

return model.objects.raw('SELECT %(objects)s.* FROM %(objects)s JOIN %(relations)s ON %(objects)s.id = %(relations)s.object_id AND %(relations)s.content_type_id = %(content_type)s JOIN %(terms)s ON %(relations)s.term_id = %(terms)s.id WHERE %(terms)s.id = %(term_id)s %(order_by)s' % data)

关于python - Django 按通用外键排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3967574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com