Вложенный список Django из двух связанных таблиц - PullRequest
0 голосов
/ 09 ноября 2019

У меня есть две модели в 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, отправляемых в базу данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...