Python 获取商品->产品关系的最低价格列表

Python 获取商品->产品关系的最低价格列表,python,sql,django,django-models,django-orm,Python,Sql,Django,Django Models,Django Orm,我认为这个标题不太准确,但我不知道如何更好地描述它 我的模型如下所示: 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.CharF

我认为这个标题不太准确,但我不知道如何更好地描述它

我的模型如下所示:

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"))
我想做的是得到一个产品列表,可以选择按类别、品牌、供应商、价格过滤。。。该产品的最低价格和供应商。请记住,通常每个产品都有不止一个产品。每个产品都有一个供应商,但两个供应商可以销售相同的产品

我希望以最有效的方式获得此列表,但这样做需要很多时间:

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
我甚至都不知道那个价格的供应商的名字!我不知道怎么得到它


以有效的方式实现这一点的最佳方式是什么?我觉得我遗漏了一些东西…

首先,您应该发现数据库中有哪些表以及它们之间有哪些关系,因为一个模型并不意味着一个表由Django决定。您还应该知道这些表是如何调用的。通常,名称由应用程序的名称、下划线和模型名称组成。 其次,您始终可以使用Django对数据库执行原始查询

差不多 some_list=listProducts.objects.raw '选择articles.supplier、articles.id、articles.ean、articles.model、articles.price、, 物品。库存,产品。ean,产品。型号,产品。说明,产品。名称,产品。imag 从文章 在products.id=articles.product\u id上加入产品
其中articles.price=select minarticles.price from articles'

Afaik django创建了group by,我认为效率问题来自于此。我已经将django生成的sql查询添加到该查询集的输出中。在那里你可以看到多个group by语句。文章有product_id=models.ForeignKey'Products',unique=True,那么这不可能是真的:。。。但两个供应商可以销售相同的产品。除非您为每个供应商创建不同的产品记录/行。准确地说,供应商销售的每个不同产品都是一个商品行。如果两个供应商销售相同的产品,他们将在Articles表中有两个不同的行,在Products表中只有一行,其中产品信息为:description,brand。。。。这是一种不同供应商之间的产品统一系统。@Nacho:我重复一遍:with unique=True您不能有两件产品具有相同的产品id。这就是unique的意思,您知道吗?@Brunodesshuilliers对不起,您是对的。此模型是从现有表自动生成的,未签出。让我们看看这是否有帮助。