gpt4 book ai didi

sql - 具有多个连接字段的 Django ORM 查询

转载 作者:行者123 更新时间:2023-12-04 20:41:54 24 4
gpt4 key购买 nike

我怎么能把这个 mysql 查询变成 django ORM?

SELECT search_products.model, search_products.year, search_products.size, search_avg_price.estimated_price
FROM search_products
left JOIN search_avg_price
ON search_products.model=search_avg_price.model and search_products.size=search_avg_price.size and search_products.year=search_avg_price.year

我已经试过了
latest_products = Products.objects.all().prefetch_related("avg_price")

但这被 django 翻译为
SELECT `search_products`.`id`, `search_products`.`size`, `search_products`.`year`, , `search_products`.`model`, `search_products`.`avg_price_id`
FROM `search_products`


latest_products = Products.objects.all().select_related("avg_price")

这被 django 翻译为:
SELECT `search_products`.`id`, `search_products`.`size`, `search_products`.`year`, , `search_products`.`model`, `search_products`.`avg_price_id`, `search_avg_price`.`id`, `search_avg_price`.`model`, `search_avg_price`.`size`, `search_avg_price`.`year`, `search_avg_price`.`estimated_price` 
FROM `search_products`
INNER JOIN `search_avg_price` ON ( `search_products`.`avg_price_id` = `search_avg_price`.`id` )

如果我在数据库中运行上述 SQL,我会得到正确的结果......

编辑:模型和 View
class Avg_price(models.Model):
model = models.CharField(max_length=50, blank=True)
size= models.IntegerField(blank=True, null=True)
year= models.IntegerField(blank=True, null=True)
estimated_price= models.IntegerField(blank=True, null=True)

class Products(models.Model):
product_id =models.IntegerField(blank=True, null=True)
link_id = models.CharField(max_length=200, blank=True)
location = models.CharField(max_length=200, blank=True)
model = models.CharField(max_length=50, blank=True)
size= models.IntegerField(blank=True, null=True)
price= models.IntegerField(blank=True, null=True)
year= models.IntegerField(blank=True, null=True)
type=models.ForeignKey(Type)
avg_price = models.ForeignKey(Avg_price)

def __unicode__(self): # Python 3: def __str__(self):
return self.location

模板
{% if latest_products %}
{% for product in latest_products %}
<ul>
<li id="col_one">
<h5>{{product.avg_price.estimated_price}}</h5>
<h5>{{product.model}}</h5>

最佳答案

您可以将表列表传递给方法 extra() 并将条件从 sql 查询的 ON 放入 extra() 中的 where 部分

Product.objects.extra(
tables=['search_avg_price'],
where=[
'"search_products"."model"="search_avg_price"."model"',
'"search_products"."size"="search_avg_price"."size"',
'"search_products"."year"="search_avg_price"."year"'
]
)

阅读更多关于额外的信息:
https://docs.djangoproject.com/en/1.6/ref/models/querysets/#extra

关于sql - 具有多个连接字段的 Django ORM 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24961029/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com