2017-02-16 62 views
0

我有一個TransportationOrders表。每個TransportationOrder都有一條路線,每條路線都有地方。Django Rest框架上的多個屬性排序

我需要的是列出所有TransportationOrders,但按照我必須訪問的第一個地方的名稱排序。

我的模型簡化:

class TransportationOrder(models.Model): 
    name = models.CharField(max_length=45, unique=True) 
    user = models.ForeignKey('auth.User') 
    description = models.CharField(max_length=300, blank=True, null=True) 
    route = models.ManyToManyField(Place, through='PlaceHasTransportationOrder') 


class PlaceHasTransportationOrder(models.Model): 
    place = models.ForeignKey(Place, on_delete=models.CASCADE) 
    transportation_order = models.ForeignKey(TransportationOrder, related_name="route", on_delete=models.CASCADE) 
    order = models.IntegerField(default=1) #This indicate the order of visits 
    date = models.DateField() 

class Place(models.Model): 
    name = models.CharField(max_length=45) 
    address = models.CharField(max_length=45, null=True, blank=True, default=None) 
    lat = models.FloatField(null=True, blank=True, default=None) 
    lon = models.FloatField(null=True, blank=True, default=None) 

我試圖定義上TransportationOrder模型的方法,但這不起作用磨片我嘗試http:///url?ordering=first_place_name 因爲這個排序工作在數據庫級別。我有什麼選擇?

def first_place_name(self): 
    place = Place.objects.all().filter(placehastransportationorder__transportation_order=self, placehastransportationorder__order=1) 
    return place[0].name 

回答

1

嘗試使用Django QuerySets的order_by方法。我相信你想要的是

TransportationOrder.order_by('routes__name').first() 

或類似的東西。

作爲一個例子,我使用Django 1.10.5將模型加載到一個模型中。

我創建5個對象:pp2Place條目,tTransportationOrder,並pt & pt2PlaceHasTransportationOrder條目。

ptp2有關pt2。在ptpt2上均使用TransportationOrder對象t

我將Place的「測試」和「字母」命名爲第二個「Alphabet」。這使得它使剛剛上TransportationOrderroutes領域,基本的查詢將在ID順序返回:

t.first().routes.all().values_list('name') <QuerySet [('Testing',), ('Alphabet',)]>

應用我上面提到的導致order_by

t.order_by('routes__name').values_list('routes__name') <QuerySet [('Alphabet',), ('Testing',)]>

編輯:

最後一條語句的輸出按順序列出TransportationOrder對象,它們的順序爲Place名稱。我錯誤地縮小了輸出以僅輸出routes__name關係路徑的值。

+0

非常有用的答案,我很抱歉我的不好解釋。我非常想要的是列出我所有的TransportationOrders,所有這些。但按照我必須先訪問的地方名稱排序。 (我要編輯試圖更加清晰) – Marcelo

+0

如果您將values_list取消爲最終輸出結果,那就是您將得到的結果。我犯了通過路線字段打印地點的錯誤,但運輸訂單將按照您的要求訂購。 – Neelik