我认为标题不是很准确,但我不知道如何更好地描述它。
我的模型看起来像这样:
class Articles(models.Model):
id = models.IntegerField(primary_key=True)
supplier = models.CharField(max_length=765, blank=True)
ref = models.CharField(max_length=180, blank=True)
ean = models.CharField(max_length=42, blank=True)
model = models.CharField(max_length=180, blank=True)
price = models.FloatField(null=True, blank=True)
stock = models.IntegerField(null=True, blank=True)
product_id = models.ForeignKey('Products', unique=True)
class Products(models.Model):
id = models.IntegerField(primary_key=True)
eans = models.TextField(blank=True)
model = models.CharField(max_length=180, blank=True)
description = models.CharField(max_length=9000, blank=True)
name = models.CharField(max_length=765, blank=True)
brand_id = models.ForeignKey('Brands', unique=True, db_column='brand_id')
category_id = models.ForeignKey('Categories', unique=True)
image = models.CharField(max_length=765, blank=True)
我想要的是获得该产品的最低价格和供应商的产品清单(可选择按类别,品牌,供应商,价格......进行筛选)。请记住,每种产品通常都有不止一篇文章(每篇文章都有供应商,但有两家供应商可以销售相同的产品)。
我希望以最有效的方式获得此列表,但这需要很长时间才能完成这样的事情:
Products.objects.select_related().filter(articles__supplier__in=("Supplier1","Supplier2")).filter(category_id__in=(413,678,699,736,770)).filter(articles__stock__gt=0).annotate(mp=Min("articles__price"))
这是django生成的SQL查询:
SELECT `products`.`id`, `products`.`eans`, `products`.`model`,
`products`.`description`,`products`.`name`, `products`.`brand_id`,
`products`.`category_id`, `products`.`image`,
MIN(`articles`.`price`) AS `mp`,
FROM `products`
LEFT OUTER JOIN `articles` ON (`products`.`id` = `articles`.`product_id`)
INNER JOIN `categories` ON (`products`.`category_id` = `categories`.`id`)
INNER JOIN `articles` T4 ON (`products`.`id` = T4.`product_id`)
INNER JOIN `brands` ON (`products`.`brand_id` = `brands`.`id`)
WHERE (`articles`.`supplier` IN ("Supplier1", "Supplier2")
AND `products`.`category_id` IN (413, 678, 699, 736, 770)
AND T4.`stock` > 0 )
GROUP BY `products`.`id`, `products`.`id`, `products`.`eans`, `products`.`model`,
`products`.`description`, `products`.`name`, `products`.`brand_id`,
`products`.`category_id`, `products`.`image`
ORDER BY NULL
我甚至没有得到该价格的供应商名称! (我不知道如何获得它)。
以有效的方式完成此操作的最佳方式是什么?我觉得我错过了什么......
答案 0 :(得分:3)
首先,你要发现数据库中有哪些表以及它们之间有什么关系,因为一个模型并不意味着一个表(由Django来决定)。您还应该知道如何调用表。通常名称由name_of_django_app组成,然后是下划线,然后是模型名称。 其次,您始终可以使用Django对数据库进行原始查询。
喜欢的东西
some_list = list(Products.objects.raw
( 'select articles.supplier,articles.id,articles.ean,articles.model,articles.price,
articles.stock,products.ean,products.model,products.description,products.name,products.imag
from articles
join products on products.id = articles.product_id
where articles.price = (select min(articles.price) from articles)
'))