タイトルはあまり正確ではないと思いますが、それをより適切に説明する方法がわかりません。
私のモデルは次のようになります。
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)
私がやりたいのは、その製品の最低価格とサプライヤーを含む製品のリスト (オプションでカテゴリ、ブランド、サプライヤー、価格でフィルター処理されます...) を取得することです。通常、各製品には複数の記事があることに注意してください (各記事にはサプライヤーがいますが、2 つのサプライヤーが同じ製品を販売できます)。
このリストを最も効率的な方法で取得したいのですが、次のようなことを行うには時間がかかります。
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
そして、私はその価格のサプライヤー名すら取得していません! (入手方法がわかりません。)
効率的な方法でこれを行うための最良の方法は何ですか? 私は何かが欠けているように感じます...