在Django Rest Framework上按多个属性排序

时间:2017-02-16 21:32:22

标签: django django-models django-rest-framework

我有一张TransportationOrders表。每个TransportationOrder都有一条路线..每条路线都有地方。

我需要的是列出所有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 Model上定义一个方法,但是当我尝试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 个答案:

答案 0 :(得分:1)

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

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

或类似的东西。

作为一个例子,我使用Django 1.10.5将你的模型加载到一个。

我创建了5个对象:pp2Place条目,tTransportationOrderpt& pt2PlaceHasTransportationOrder个条目。

pt相关,p2pt2相关。 TransportationOrdert同时使用了pt对象pt2

我将Place命名为“Testing”和“Alphabet”,然后创建“Alphabet”。这使得只有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',)]>

编辑:

最后一个语句的输出按其TransportationOrder名称按顺序列出Place个对象。我错误地将输出缩小到仅输出routes__name关系路径的值。