Как объединить фильтр значений с набором запросов определенного поля Foreignkey в моей модели Django - PullRequest
2 голосов
/ 28 апреля 2019

У меня есть это поле в моей модели:

class PlayerDetailPage(Page):
    picture = models.ForeignKey('wagtailimages.Image', null=True, on_delete=models.SET_NULL, related_name='+', help_text=_('Player profile picture.'))

И я хочу создать тег включения, в котором я получаю доступ к различным полям в этой модели страницы трясогузки. Для эффективности БД я использую значения, но в поле picture я хочу полный набор запросов. Не только значение в словаре, потому что мне нужно визуализировать изображение.

Прямо сейчас у меня есть это представление:

PlayerDetailPage.objects.values('title', 'path' , 'slug', 'owner__age', 'owner__nationality', )

Пока все хорошо, я выбираю только те поля, которые мне нужны, и получаю хороший словарь с одним запросом. Однако для поля picture мне нужен полный набор запросов, потому что это поле изображения Wagtail. Он имеет несколько хороших параметров рендеринга. Как я могу объединить это, на мой взгляд, чтобы получить лучший дБ эффективный запрос?

И, к сожалению, прямой URL-адрес не является полем в модели изображения. Думаю, это свойство, я пробовал picture__url, но это разрешено в:

Cannot resolve keyword 'url' into field. Choices are: collection, collection_id, created_at, file, file_hash, file_size, focal_point_height, focal_point_width, focal_point_x, focal_point_y, height, id, renditions, tagged_items, tags, title, uploaded_by_user, uploaded_by_user_id, width

Мой взгляд:

@register.inclusion_tag('wdashboard/tags/player_widget.html', takes_context=True)
def player_widget(context):

    qs = PlayerDetailPage.objects.values('title', 'path' , 'picture__file', 'slug', 'owner__age', 'owner__nationality', )
    for ins in qs:
        ins['picture'] = Image(file=ins['picture__file'])

        return {'values1': qs,'request': context['request'],}

1 Ответ

2 голосов
/ 28 апреля 2019

То, что вы ищете, невозможно без хитрого решения ИМХО.Причина в том, что метод values выполняет очень четко определенный запрос только один раз для БД, а затем преобразует результаты в dict.Таким образом, вы никогда не получите оригинальный PlayerDetailPage объект, кроме диктата.Например, если у вас есть модель MyModel и вы выполняете следующие действия:

x = MyModel.objects.get(id=1)
print(type(x)) # <class 'MyModel'>

Но для значений дело обстоит иначе

x = MyModel.objects.values('id').get(id=1)
print(type(x)) # <class 'dict'>

Таким образом, вы теряете оригинальный объект и получаете дикт.

Немного умное решение

Если у вас нет другого выбора, кроме использования values, я бы предложил следующее решение.

Создайте свой запрос, а такжеполучите данные , необходимые вам от Image модели.

 qs = PlayerDetailPage.objects.values('picture__name') # assume there is a name field.

Теперь переберите qs, инициализируйте Image объект, ( не сохраняйте его ) и добавьте его в свой словарь следующим образом

from wagtail.images.models import Image

for ins in qs:
    ins['picture'] = Image(name=ins['picture__name'])

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

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