2017-02-16 65 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