2017-02-16 4 views
0

私はTransportationOrdersのテーブルを持っています。すべてのTransportationOrderにはルートがあり、すべてのルートにはプレイスがあります。Django Rest Frameworkの多くの属性からの注文

私が必要とするのは、すべての運送費明細書ですが、私が訪れなければならない最初の場所の名前で並べ替えられています。

私のモデルを簡素化:

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 にしてみてくださいWHEこれは動作しません。どのようなオプションがありますか?

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を使用してモデルを1つのモデルにロードしました。

私は5つのオブジェクトを作成:pp2Placeエントリ、tTransportationOrderあり、そしてpt & pt2ですがPlaceHasTransportationOrderエントリです。

ptに関連し、p2pt2に関連していた。 TransportationOrderオブジェクトtは、ptpt2の両方で使用されました。

私はPlaceの "Testing"と "Alphabet"という名前をつけ、 "Alphabet"を2番目に作成しました。

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

を私は上記の結果order_by適用:

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

EDITをTransportationOrderroutesフィールド上だけで基本的なクエリは、ID順でそれらを返すように、これはそれを作りました:

最後のステートメントからの出力は、TransportationOrderオブジェクトを順番にリストします()。の名前。私は間違って出力を絞り込んで、routes__nameの関係経路の値のみを出力しました。

+0

非常に有益な答えです。私の悪い説明には申し訳ありません。私がfinnalyしたいのは、私のすべてのTransportationOrdersをリストすることです。しかし、最初に訪れなければならない場所の名前でソートされています。 (私はより明確にしようと編集するつもりです) – Marcelo

+0

最終出力からvalues_list呼び出しを取得すると、その結果が得られます。私は経路のフィールドで場所を印刷するのは間違いですが、輸送の注文はあなたが望む順序になります。 – Neelik

関連する問題