Как сделать этот запрос соединения в Django

В Django у меня есть две модели:

class Product(models.Model): name = models.CharField(max_length = 50) categories = models.ManyToManyField(Category) class ProductRank(models.Model): product = models.ForeignKey(Product) rank = models.IntegerField(default = 0) 

Я помещал разряд в отдельную таблицу, потому что каждое представление страницы приведет к изменению ранга, и я был обеспокоен тем, что все эти записи сделают мои другие (в основном прочитанные) запросы медленными.

Я собираю список Products из простого запроса:

 cat = Category.objects.get(pk = 1) products = Product.objects.filter(categories = cat) 

Теперь я хотел бы получить все звания для этих продуктов. Я бы предпочел сделать все за один раз (используя SQL-соединение) и задавался вопросом, как выразить это с помощью механизма запросов Django.

Каков правильный способ сделать это в Django?

3 Solutions collect form web for “Как сделать этот запрос соединения в Django”

Это можно сделать в Django, но вам придется немного изменить структуру своих моделей:

 class Product(models.Model): name = models.CharField(max_length=50) product_rank = models.OneToOneField('ProductRank') class ProductRank(models.Model): rank = models.IntegerField(default=0) 

Теперь, когда вы выбираете объекты Product, вы можете выполнить отношения «один к одному» в одном запросе с помощью метода select_related () :

 Product.objects.filter([...]).select_related() 

Это приведет к одному запросу, который извлекает ранжирование продуктов с помощью соединения:

 SELECT "example_product"."id", "example_product"."name", "example_product"."product_rank_id", "example_productrank"."id", "example_productrank"."rank" FROM "example_product" INNER JOIN "example_productrank" ON ("example_product"."product_rank_id" = "example_productrank"."id") 

Мне пришлось переместить поле отношений между Product и ProductRank в модель продукта, потому что оно выглядит как select_related (), которое следует за иностранными ключами только в одном направлении.

Я не проверял, но:

 products = Product.objects.filter(categories__pk=1).select_related() 

Должен захватить каждый экземпляр.

Добавьте вызов метода select_related () QuerySet, хотя я не уверен, что захватывает ссылки в обоих направлениях, это наиболее вероятный ответ.

  • (python-) sqlite3: запретить COMMIT от сброса курсора чтения на несвязанной временной таблице
  • Вставка pyodbc в sql
  • Неправильно сконфигурировано («настройки.DATABASES неправильно настроены.») Ошибка при попытке настроить Django
  • Python и sqlite3 - импорт и экспорт баз данных
  • Сортировка и ограничение набора запросов по количеству комментариев и дате с помощью queryset.extra () (django)
  • Ошибки компоновщика с libmsodbcsql-13.0.so.0.0, предотвращающие соединение pyODBC с MS SQL. CentOS 7
  • Запрос сбой MS Access
  • Как правильно отключить кеширование в сеансе ORM Sqlalchemy?
  • SQLAlchemy: несколько счетчиков в одном запросе
  • pysqlite: замена подстановки для имен столбцов или таблиц?
  • Как добавить «3 месяца» к объекту datetime.date в python?
  • Python - лучший язык программирования в мире.