INNER JOIN в django orm
У меня есть две таблицы, которые содержат только одинаковые идентификаторы продуктов, и у них нет правых ключей. Поэтому вопрос заключается в том, как я могу отфильтровать их обе в запросе по id. В SQL я хочу сделать что-то вроде этого
SELECT Url FROM pricehistory p INNER JOIN product d ON p.ProductID = d.ProductID
Модели выглядят следующим образом:
class Product(models.Model):
ProductID = models.CharField(..)
Price = models.FloatField(..)
Url = models.CharField(..)
....
class PriceHistory(models.Model):
ProductID = models.CharField(..)
Price = models.FloatField(..)
Retailer = models.CharField(..)
Timestamp = models.DateTimeField(..)
Вы можете фильтровать с помощью Exists(…)
подзапроса [Django-doc]:
from django.db.models import Exists, OuterRef
Product.objects.filter(
Exists(PriceHistory.objects.filter(ProductID=OuterRef('ProductID')))
).values('Url')
Это не будет выполнять INNER JOIN
, но сделает WHERE EXISTS (…)
подзапрос, который сохранит только Url
те Product
, которые имеют PriceHistory
.
Я бы посоветовал обратить ProductID
в ForeignKey
, который относится к ProductID
из Product
, так:
class Product(models.Model):
ProductID = models.CharField(unique=True)
# …
class PriceHistory(models.Model):
ProductID = models.ForeignKey(
Product,
to_field='ProductID',
on_delete=models.CASCADE,
db_column='ProductID'
)
# …
Это позволит хранить ProductID
из Product
в базе данных, но также гарантирует ссылочную целостность и делает более удобным выполнение запросов с помощью Django ORM.