[英]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.