python - 获取文章->产品关系的最低价目表

标签 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.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 决定)。您还应该知道这些表是如何调用的。通常名称由 name_of_django_app 组成,然后是下划线,然后是模型名称。 其次,您始终可以使用 Django 对数据库进行原始查询。

类似的东西 some_list = list(产品.objects.raw ('选择articles.supplier,articles.id,articles.ean,articles.model,articles.price, 文章.库存、产品.ean、产品.型号、产品.描述、产品.名称、产品.imag 来自文章 在 products.id =articles.product_id 上加入产品 其中articles.price =(从文章中选择min(articles.price))'))

关于python - 获取文章->产品关系的最低价目表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19423024/

相关文章:

python - 带有 subprocess.run() 脚本的 Oarsub 作业

sql查询在多列上不同

php - 用户事件表中一天的 MYSQL 'SELECT' 和 COUNT "active"用户

mysql - 计算来自发件人的未读邮件

ruby-on-rails - 实现 Web API 请求 throttle/速率限制的常用方法有哪些?

django - 如何使用 Django 中间件将值传递给每个 View

python - 如何使用 Python 和 Django 创建 SaaS 应用程序

python - 根据日期增加 Pandas Dataframe 列

python - web2py:在Python中写入 session 变量

python - Python中pickle的常见用例