Как сделать этот запрос соединения в 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, хотя я не уверен, что захватывает ссылки в обоих направлениях, это наиболее вероятный ответ.

  • как безопасно генерировать инструкцию SQL LIKE с помощью python db-api
  • Как кэшировать вызовы alchemy sql с Flask-cache и redis?
  • sql "LIKE" эквивалент в django-запросе
  • Могу ли я экспортировать фрейм данных Pandon Pandas в MS SQL?
  • Ошибка SQLAlchemy: «Форматы аргументов нельзя смешивать» при вводе переменных
  • cx_Oracle: Как я могу получить каждую строку в качестве словаря?
  • Как я могу преобразовать pyspark.sql.dataframe.DataFrame обратно в таблицу sql в записной книжке databricks
  • Использование DATEADD в sqlalchemy
  • Python - лучший язык программирования в мире.