2016-12-30 60 views
3

如何爲相關管理員設置Django查詢的默認訂單?相關查詢中的Django Meta排序

您可以設置默認順序與Meta.ordering:

class Subject(Model): 
    title = TextField() 

class Course(Model): 
    subject = ForeignKey(Subject) 

    class Meta: 
     ordering = ['id'] 

當您運行Course.objects.all()這將設置的順序。但是當您運行subject.course_set.all()時,課程可能會失靈。

理想情況下,解決方案不會涉及對查詢數據庫的龐大現有代碼庫的更改。

注:數據庫PostgreSQL的

+0

'subject.course_set.all()'也會被排序。你怎麼知道它不是? – ettanany

+1

我跑了它。有趣的是,它被**顛倒了**。當用'''''''''subject.course_set.all查詢時,用'''Subject.objects.all()'''查詢並且課程由id **降序排列**時, ()'''。 – Will

+0

'subject.course_set.all()'的順序與您在「課程」模型中設置的順序相同,您是不是這樣? – ettanany

回答

0

據我所知,有一個黑客
可以使管理者法像

class SomeManagerSet(models.QuerySet): 
    def ordered(self): 
     return self.order_by("id") 

,並通過

objects = SomeManagerSet.as_manager() 
模型激活

然後用於相關的查詢,如subject.course_set.ordered()

+0

好的...有沒有一種非常好的方法來做到這一點?這也需要更改所有現有的查詢代碼。 – Will

+0

您可以在這種情況下重寫'all()'方法,您不需要重寫所有現有的代碼 –

+0

我認爲您可以在Meta類中指定一個管理器類,它可以實現此行爲。 – allo