2017-04-02 46 views
0

我有兩個班現場訂購查詢外鍵設置:Django的:如何通過引用的類

class Manufacturer(models.Model): 
    name = models.CharField(max_length=50) 

class Part(models.Model): 

    name = models.CharField(max_length=255) 
    manufacturer = models.ForeignKey(
     Manufacturer, 
     verbose_name=_("Manufacturer"), 
     null=True, 
     blank=True, 
     help_text=_("The manufacturer of the part.") 
    ) 

現在我定義,使該獲取所有零件鏈接到particual查詢製造商。這我已經完成了parts = self.part_set.all()。但現在我需要對訂單進行排序。所以我認爲.order_by()可以做到這一點,所以最後我有

def get_parts(self): 
    return list(self.part_set.all().order_by('name')) 

不幸的是,這是不排序正確。所以我的問題是:什麼是對一些屬性引用另一個對象的對象列表進行排序的正確方法是什麼?

+0

'self.part_set.order_by('manufacturer__name')'也許? –

+0

我需要嘗試一下,但我想按Part.name排序 – frlan

+1

'get_parts'是製造商內的一種方法,對吧?那麼也許'self.part_set.order_by('part__name')'? –

回答

1

通過每個型號的Meta類總是有默認排序的選項。所以:

class Part(models.Model): 
    name = models.CharField(max_length=255) 
    manufacturer = ... 

    class Meta: 
     ordering = ['name'] # or ['-name'] for descending 

現在,每次你得到Part對象,他們會被name除非order_by在查詢中使用排序。

來到你的問題,你可以使用這個:

self.part_set.order_by('part__name') 

,但如果你已經指定了Part類中的ordering設置Meta那麼你不必把它寫這種方式。而是寫:

self.part_set.order_by('part') 

和Django的將責令Part對象作爲每PartMetaordering設置。

+0

其實我看到我做了某種正確的方式。通過更深入的檢查,我發現在Part.name中有一個雙空格的數據問題。 – frlan