簡體   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