繁体   English   中英

Django通过通用外键排序

[英]Django Order By Generic Foreign Key

嘿,这是一个快速的。 我有两个模型,即Post和Term,我希望能够对(分类)帖子以及其他(未来)模型进行标记和分类。 我的帖子模型具有以下字段:标题,内容,发布(日期),并且我的条款的声明如下:

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

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

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)

据我所知,使用django是不可能的,因为order_by -arguments会转换为数据库列/表,而content_object不会像这样在数据库中退出。 这也是为什么必须使用object_id / content_type查找内容类型的原因...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM