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 (…)
子查询,该子查询将仅保留具有 [=] 的 Product
的 Url
15=].
我建议将 ProductID
转为 ForeignKey
,它引用 Product
的 ProductID
,所以:
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>
)
# …
这将把Product
的ProductID
存储在数据库中,同时也保证了参照完整性,更方便使用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 (…)
子查询,该子查询将仅保留具有 [=] 的 Product
的 Url
15=].
我建议将 ProductID
转为 ForeignKey
,它引用 Product
的 ProductID
,所以:
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>
)
# …
这将把Product
的ProductID
存储在数据库中,同时也保证了参照完整性,更方便使用Django ORM进行查询。