У меня есть две модели в Django models.py с отношением один-ко-многим:
class Parcel(models.Model):
farmer = models.CharField(max_length=200)
name = models.CharField(max_length=200)
area = models.FloatField()
class Crop(models.Model):
parcel = ForeignKey(Parcel, on_delete=models.CASCADE)
code = models.CharField(max_length=20)
date_planted = models.DateTimeField()
date_harvested = models.DateTimeField()
На одной посылке выращивается несколько культур в течение нескольких лет. Обрезка связана с посылкой через ForeignKey
. Теперь мне нужно отобразить вложенный список всех посылок и культур от выбранного фермера, что-то вроде:
[{ name: "parcel one",
area: 22.2,
crops: [{"code": "wheat", planted: "2017-01-01", harvested: "2018-09-12"},
{"code": "maize", planted: "2019-04-03", harvested: "2019-09-09"}]
},
{ name: "parcel two",
area: 11.7,
crops: [{"code": "wheat", planted: "2017-01-01", harvested: "2018-09-12"},
{"code": "maize", planted: "2019-04-03", harvested: "2019-09-09"},
{"code": "wheat", planted: "2019-09-19", harvested: None}]
}]
Сейчас я использую следующий цикл для получения списка всех посылок и культур длявыбранный фермер:
from django.forms.models import model_to_dict
from .models import Parcel
from .models import Crop
parcel_queryset = Parcel.objects.filter(farmer="John Smith")
filtered_parcel_list = []
for parcel in parcel_queryset:
parcel_dict = model_to_dict(parcel)
parcel_dict["crops"] = list(parcel.crop_set.all().values())
filtered_parcel_list.append(parcel_dict)
Однако мой запрос выглядит довольно медленным, если много посылок. Я подозреваю, что Django отправляет новый запрос в базу данных с каждым оператором parcel.crop_set.all().values()
в моем цикле for.
Можно ли как-нибудь упростить мой запрос? Если возможно, я бы хотел избавиться от for loop
и сократить количество запросов SQL, отправляемых в базу данных.