如何在Django模型中获取唯一值?
我有三个模型:
class Shipment(models.Model):
job_id = models.CharField(max_length = 255)
time = models.DateTimeField(auto_now = True, auto_now_add = True, db_index = True)
class ShipmentBagSealMapping(models.Model):
bag_seal = models.CharField(max_length = 255)
status = models.CharField(max_length = 255, default = 'open')
time = models.DateTimeField(auto_now = True, auto_now_add = True, db_index = True)
shipment_id = models.ForeignKey('Shipment', related_name = 'bags')
class ShipmentPPTLMapping(models.Model):
pptl_id = models.CharField(max_length = 255)
time = models.DateTimeField(auto_now = True, auto_now_add = True)
shipment_id = models.ForeignKey('Shipment', related_name = 'pptls')
我想要获取那些已经关闭的袋子的数量。
一开始我有一个 pptl_id
。所以,我从 ShipmentPPTLMapping
模型中获取 shipment_id
,然后用这个 shipment_id
查询 ShipmentBagSealMapping
模型。
这是我目前做的事情:
bags_closed = len(Shipment.objects.filter(bags_status_exact = 'close', bags_time_range = [start_time,end_time],pptls__pptl_id__exact = pptls.pptl_id))
问题是每个袋子可能有多个运输记录,因此根据我现在的查询,我能得到所有关闭的运输记录的数量。我想再加一个过滤条件,比如 bags_value = distinct
类似这样的:
bags_closed = len(Shipment.objects.filter(bags__status__exact = 'close', bags__time__range = [start_time,end_time],pptls__pptl_id__exact = 147)).**bags_seal = distinct**
问题2
另外,我需要获取 last_bagged_on
参数,这个参数能告诉我最后一个关闭的袋子的时间。显然,这个字段是从 ShipmentBagSealMapping
模型中获取的,但我现在的对象是 Shipment
模型。
我该如何获取最后一个关闭的袋子?
类似这样的:
last_bagged_on = Shipment.objects.filter(bags__status__exact = 'close', bags__time__range = [start_time,end_time],pptls__pptl_id__exact = pptls.pptl_id)[0].**bags_time**
1 个回答
1
第一条
用 len(queryset)
来计算对象的数量并不是个好方法。建议使用 .count()
来替代。
bags_closed = Shipment.objects.filter(bags__status__exact='close',
bags__time__range=[start_time,end_time],
pptls__pptl_id__exact = 147)\
.distinct('bags').count()
第二条
last_bagged_on = ShipmentBagSealMapping.objects.filter(
status__exact='close',
time__range=[start_time,end_time],
shipment_id__pptls__pptl_id__exact=pptls.pptl_id)[0]
如果你在使用 Django 1.6,应该用 last_bagged_on = ShipmentBagSealMapping...first()
,而不是用 [0]
。