Лучший способ включить кверисет с подвыбором в 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
)
Двойное подчеркивание - это поиск связанных объектов.