2010-05-21 60 views
0
accepted_bids = Bid.objects.filter(shipment__user=u, status='acc').select_related('shipment') 
completed_shipments = [] 
for b in accepted_bids: 
    completed_shipments.append(b.shipment) 
vehicles_shipped = [] 
for s in completed_shipments: 
    vehicles_shipped.extend(s.items.all()) 

最后,我想要一份运输车辆清单。如果车辆是已完成的货件的一部分,则该车辆将被运送。如果出货已接受,则装运完成。有没有简化这个Django查询的方法?

我不希望迭代查询集,从而在必要之前强制命中数据库......例如,是否有办法从出价列表中获取所有相关货件?


这里是我的模型的下调版本:

class Shipment(Model): 
    user = ForeignKey(User, related_name='shipments') 

class ShipmentItem(models.Model): 
    shipment = ForeignKey(Shipment, related_name='items') 

    class Meta: 
    abstract = True 

class VehicleItem(ShipmentItem): 
    pass 

class Bid(Model): 
    user = ForeignKey(User, related_name='bids') 
    shipment = ForeignKey(Shipment, related_name='bids') 

回答

1

直供模式是很重要的。但这里有一个猜测:

Vehicle.objects.filter(shipment__bid__status='acc', shipment__user=u) 
+0

对不起,以为你有足够的信息。您所建议的问题是,“出价”是复数(出货可能有很多出价),所以我认为您不能像这样过滤它? – mpen 2010-05-21 06:37:37

+0

所以你说的是*所有的*出货都需要被接受? – 2010-05-21 07:09:16

+0

不......一点也不。只能接受一个出价。但'shipment__bid__status'不是一回事。这将是'shipment__bids__status' ...这将如何工作?你需要找到属于装运的车辆并接受投标...“许多投标”(但只有一个被接受)的事情使这变得复杂。 – mpen 2010-05-21 18:31:51