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.

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