Как я могу отложить много-много полей от объекта? - PullRequest
0 голосов
/ 30 апреля 2019

Я пытаюсь отложить поле из моей модели, но .defer (), кажется, не работает.

Я запускаю Django 1.9 с python 2.7.

(пример кода, упрощенный)


models.py


class MyModelA(models.Model):
    title = models.CharField(max_lenght=50)
    file = models.FileField(upload_to='test/')


class MyModelB(models.Model):
    title = models.CharField(max_lenght=50)
    defer_this = models.ManyToManyField(MyModelA, blank=True)

views.py

query =  MyModelB.objects.defer('defer_this')

for i in query:
    print i.title, i.defer_this.all()


И он печатает defer_this объекты.

Можеткто-нибудь объяснит мне, как это работает / почему это происходит?

1 Ответ

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

По документам

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

Это делается путем передачи имен полей, которые не загружаются, в defer ()

Набор запросов с отложенными полями будет по-прежнему возвращать экземпляры модели. Каждое отложенное поле будет извлечено из базы данных, если вы получите доступ это поле (по одному, а не все отложенные поля одновременно)

Это означает, что defer не мешает вам получить доступ к атрибуту, который вы передаете defer. Он просто не получит его из базы данных. Когда вы (пытаетесь) получить доступ к отложенному атрибуту. Тогда он получит его из базы данных.

А в случае полей M2M они по умолчанию (вид) откладываются. Когда вы запрашиваете модель, содержащую поле M2M, django не будет выполнять соединение и получать данные из связанных таблиц. Вы должны явно указать django, используя prefetch_related и selected_related, чтобы выполнить соединение и получить связанные данные.

...