2017-02-16 8 views
0

У меня есть таблица TransportationOrders. У каждого TransportOrder есть Маршрут .. и у каждого Маршрута есть Места.Заказ по многим атрибутам на Django Rest Framework

Что мне нужно, это список всех Всеобъекты 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 модели, но это не работает Whe я стараюсь 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 объектов: p и p2 являются Place записей, t является TransportationOrder и pt & pt2 являются PlaceHasTransportationOrder записей.

p был связан с t и указанным здесь является собственностью pt2. Объект TransportationOrdert использовался как на pt, так и на pt2.

Я назвал «Тестирование» и «Алфавит» Place, создав второе «Алфавит». Это сделало так, что только основной запрос на routes поле TransportationOrder бы вернуть их в порядке 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',)]>

EDIT :

Вывод из последнего заявления содержит список объектов TransportationOrder по порядку Place. Я ошибочно сузил выход, чтобы выводить только значения пути отношений routes__name.

+0

Очень полезный ответ, и я сожалею о своем плохом объяснении. То, что я хочу знать, - это перечислить всех моих транспортников, все из них. Но отсортировано по названию места, которое я должен посетить первым. (Я собираюсь отредактировать, пытаясь быть более ясным) – Marcelo

+0

Если вы принимаете вызов значения_list из моего окончательного вывода, это результат, который вы получите. Я допустил ошибку при печати мест через поле маршрутов, но заказы на транспортировку будут в желаемом порядке. – Neelik