У меня 3 модели.Оптимизация запроса Django-SQL
class ShipmentPPTLMapping(models.Model):
pptl_id = models.CharField(max_length = 255)
shipment_id = models.ForeignKey('Shipment', related_name = 'pptls')
class ShipmentBagSealMapping(models.Model):
bag_seal = models.CharField(max_length = 255)
status = models.CharField(max_length = 255, default = 'open')
shipment_id = models.ForeignKey('Shipment', related_name = 'bags')
class Shipment(models.Model):
job_id = models.CharField(max_length = 255)
Мне нужно написать запрос, который отфильтровывает статус этих мешков from ShipmentBagSealMapping
closed
, которые, при условии pptl_id
from ShipmentPPTLMapping
.
У меня есть pptl_id
с самого начала. При этом я отфильтровываю все отгрузки, связанные с этим, поскольку shipments_obj
связан с ShipmentBagSealMapping
, поэтому использование shipments_obj
- единственный способ отфильтровать закрытые сумки.
shipment_pptl_mapping_obj_list = ShipmentPPTLMapping.objects.filter(pptl_id = pptl_id)
Тогда я петля вокруг shipment_pptl_mapping_obj_list
, чтобы найти мешки со статусом closed
.
for shipment_pptl_mapping_obj in shipment_pptl_mapping_obj_list:
closed_bags = shipment_pptl_mapping_obj.shipment_id.bags.filter(status = 'closed')
#and then again another loop
for bags in closed_bags:
#something
Как я могу найти все, только в 1 запросе?
Вот мой окончательный код
shipment_pptl_mapping_obj_list = ShipmentPPTLMapping.objects.filter(pptl_id = pptl_id) #--> extend this
for shipment_pptl_mapping_obj in shipment_pptl_mapping_obj_list:
closed_bags = shipment_pptl_mapping_obj.shipment_id.bags.filter(status = 'closed')
for bags in closed_bags:
#do something
Я хочу что-то вроде этого
closed_bags = Some Query
for bags in closed_bags:
#do_something
** Ошибка ** 'Не удается разрешить ключевое слово 'pptls' в поле. Выбираем: bag_seal, id, shipment_id, status "}' ' – PythonEnthusiast
Также почему имена полей FK не должны содержать' _id' в конце? В чем проблема вы имеете в виду? – PythonEnthusiast
Django добавить '_id' в каждое поле FK. id от 'object.name_id' или' object.name' для доступа к объекту. Обновлен ответ. Проблема в том, что другой программист должен использовать 'name_id_id' –