Лучший способ включить кверисет с подвыбором в Django всего за 1 обращение к базе данных

У меня есть 2 модели, Product и Productdetails с отношениями OneToOne следующим образом:

class Product(IotaModel):

   details = models.OneToOneField(
       ProductDetails,
       null=True,
       on_delete=models.SET_NULL
   )

Я хочу получить набор запросов, которые делают следующее:

SELECT *
FROM product_details
WHERE id = (
    SELECT details_id
    FROM products
    WHERE id=<product_id>
)

Я попробовал следующее:

details_id = Product.objects.filter(pk=product_pk, active=True).only('details')[:1]
return ProductDetails.objects.filter(pk=details_id, active=True)

Но это не работает, потому что .only('details') дал мне поля (id, details_id) и следующий фильтр принимает id вместо details_id.

Я также пытаюсь добавить .defer('id'), но это не работает.

Я знаю, что могу получить details_id, используя .values_list('details_id'), но я думаю, что это потребует выполнения 2 запросов к базе данных.

Каким может быть наилучший подход для достижения желаемого SQL запроса всего за 1 обращение к БД?

Заранее спасибо!

Вы должны сделать только запрос для ProductDetails. Что-то вроде этого, я думаю.

product_details = ProductDetails.objects.get(
    active=True, product__id=product_pk, product__active=True
)

Двойное подчеркивание - это поиск связанных объектов.

Вернуться на верх