django orm 中的内部连接

INNER JOIN in django orm

我有两个表,它们只包含相同的产品 ID,而且它们没有外键。所以问题是关于我如何在查询中按 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(…) subquery [Django-doc]:

进行过滤
from django.db.models import <strong>Exists</strong>, OuterRef

Product.objects.filter(
    <strong>Exists(</strong>PriceHistory.objects.filter(ProductID=OuterRef('ProductID'))<strong>)</strong>
).values('Url')

这不会执行 INNER JOIN,但会生成一个 WHERE EXISTS (…) 子查询,该子查询将仅保留具有 [=] 的 ProductUrl 15=].

我建议将 ProductID 转为 ForeignKey,它引用 ProductProductID,所以:

class Product(models.Model):
    ProductID = models.CharField(unique=True)
    # …

class PriceHistory(models.Model):
    ProductID = models.ForeignKey(
        Product,
        <b>to_field='ProductID'</b>,
        on_delete=models.CASCADE,
        <b>db_column='ProductID'</b>
    )
  # …

这将把ProductProductID存储在数据库中,同时也保证了参照完整性,更方便使用Django ORM进行查询。