如何在Django模型中获取唯一值?

0 投票
1 回答
1247 浏览
提问于 2025-04-17 23:23

我有三个模型:

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]

撰写回答