是的,我对带有连接的简单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上有外键,则默认创建该字段。代码如下:
@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)