как быстро выбрать поля в связанных таблицах в моделях Django - PullRequest
0 голосов
/ 01 апреля 2019

Я пытаюсь получить все значения в текущей таблице, а также получить некоторые поля в связанных таблицах.

class school(models.Model):
    school_name = models.CharField(max_length=256)
    school_type = models.CharField(max_length=128)
    school_address = models.CharField(max_length=256)

class hometown(models.Model):
    hometown_name = models.CharField(max_length=32)

class person(models.Model):
    person_name = models.CharField(max_length=128)
    person_id = models.CharField(max_length=128)
    person_school = models.ForeignKey(school, on_delete=models.CASCADE)
    person_ht = models.ForeignKey(hometown, on_delete=models.CASCADE)

как быстро выделить всю необходимую информацию в поле для рендеринга. будет много записей лично, я получу входные данные school_id и хочу, чтобы все люди в этой школе, а также хотели, чтобы отображалось имя_домена этого человека.

Я пытался вот так, могу получить информацию, которую хотел. И любой другой быстрый способ сделать это?

m=person.objects.filter(person_school_id=1)
.values('id', 'person_name', 'person_id', 
school_name=F('person_school__school_name'), 
school_address=F('person_school__school_address'), 
hometown_name=F('person_ht__hometown_name'))

person_name, person_id, school_name, school_address, имя_домена

если у человека много полей, список всех значений будет тяжелой.

что я имею в виду, может ли любой набор запросов объединить поля связанных таблиц, которым нет необходимости перечислять поля в значениях. Может быть так:

m=person.objects.filter(person_school_id=1).XXXX.values()

он может показывать все значения в школе, и все значения в родном городе вместе со значениями человека в м, и я могу

for x in m: 
   print(x.school_name, x.hometown_name, x.person_name)

1 Ответ

0 голосов
/ 01 апреля 2019

Вы добавляете запрос prefetch_related поверх набора запросов.

prefetch_data = Prefetch('person_set, hometown_set, school_set', queryset=m)

Где prefetch_data подготовит вашу БД для выборки связанных таблиц, а m - ваш исходныйотфильтрованный запрос (добавьте это ниже вашего Person.objects.filter(...)

Затем вы выполняете фактический запрос к БД:

query = query.prefetch_related(prefetch_data)

Где запрос будет фактическим результатомзапрос со списком Person объектов (поэтому добавьте эту строку под prefetch_data one).

Пример:

m=person.objects.filter(person_school_id=1)
.values('id', 'person_name', 'person_id', 
school_name=F('person_school__school_name'), 
school_address=F('person_school__school_address'), 
hometown_name=F('person_ht__hometown_name'))

prefetch_data = Prefetch('person_set, hometown_set, school_set', queryset=m)

query = query.prefetch_related(prefetch_data)

В этом примере я разбил запросы наболее управляемые фрагменты, но вы также можете сделать все это одной большой строкой (хотя и менее удобной для чтения):

m=person.objects.filter(person_school_id=1)
.values('id', 'person_name', 'person_id', 
school_name=F('person_school__school_name'), 
school_address=F('person_school__school_address'), 
hometown_name=F('person_ht__hometown_name')).prefetch_related('person, hometown, school')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...