我有一桌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模型上定义一个方法,但当我尝试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
发布于 2017-02-16 23:57:52
尝试使用Django QuerySets的order_by
方法。我相信你想要的是
TransportationOrder.order_by('routes__name').first()
或者类似的东西。
作为示例,我使用Django 1.10.5将您的模型加载到one中。
我创建了5个对象:p
和p2
是Place
条目,t
是TransportationOrder
,pt
& pt2
是PlaceHasTransportationOrder
条目。
p
与t
相关,p2
与pt2
相关。在pt
和pt2
上都使用了TransportationOrder
对象t
。
我将测试的Place
命名为"Testing“和"Alphabet",第二个命名为"Alphabet”。这使得对TransportationOrder
的routes
字段的基本查询就可以按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',)]>
编辑:
最后一条语句的输出按Place
名称的顺序列出了TransportationOrder
对象。我错误地缩小了输出范围,只输出routes__name
关系路径的值。
https://stackoverflow.com/questions/42285065
复制相似问题