У Джанго встроенный Imagefield
– Это здорово и делает общение с изображениями очень простым. Однако из коробки вы не можете запросить базу данных для изображений определенного измерения (ширина или высота). Например, вы не можете найти все большие изображения, которые вы храните.
Решение скрывается на виду в Django Docs Анкет
А Imagefield
принимает два аргумента: height_field
и width_field
Анкет Использовать их довольно просто:
from django.db import models class Person(models.Model): avatar = models.ImageField( blank=True, null=True, height_field="avatar_height", width_field="avatar_width", ) avatar_height = models.IntegerField(blank=True, null=True) avatar_width = models.IntegerField(blank=True, null=True)
Каждый раз, когда мы сохраняем изображение в Аватар
Поле, Django автоматически обновляет avatar_heigh
и avatar_width
Поля с новыми размерами изображения.
Это означает, что теперь у нас есть запись в базе данных, которую мы можем запросить! Если мы хотим найти все изображения хотя бы с одним большим измерением, мы можем сделать что -то вроде:
from django.db.models import Q big_dim = 500; big_images = Person.objects.filter( Q(avatar_height__gt=big_dim) | Q(avatar_width__gt=big_dim) )
Пара финальных заметок:
- Поля обновляются только на «Сохранить», поэтому, если вы добавляете это в существующую модель, вы можете пройти через каждый экземпляр и вызовать
save ()
так что поля заполнены - Нормальное использование
Person.avatar.Height
загрузил бы все изображение в память, чтобы выяснить, насколько оно велик. Это может быть медленным, если вы используете удаленное хранилище, такое как S3 или Цифровые океанские пространства Анкет Но используяPerson.avatar_height
пропускает все это. Это может привести к большому увеличению производительности, если вам нужно знать размер ваших изображений, но не нужно работать на самом изображении.
Оригинал: “https://dev.to/monty5811/django-query-imagefield-by-height-or-width-5h9c”