リストクエリでは、特定のサイトの特定の製品にいくつの価格が存在するかを示したいとします。Django ORM:rawsqlを使用しないでCount()(サブクエリ)でアノテーションをフィルタする方法
私はこれまでRawSQLを使ってこれを行う方法を見つけました。私は何か見落としていますか?
class Site(Model):
name = models.CharField(_('display name'), max_length=50)
class Price(Model):
name = models.CharField()
class SitePrice(Model):
price = models.ForeignKey(Price)
site = models.ForeignKey(Site)
今、私が欲しいの表は、次のとおりです:
queryset = Price.objects.all()
site_annotations = {}
for site in Site.objects.all():
site_annotations['num_prices_{}'.format(site.name)] = RawSQL(
'SELECT COUNT(id) '
'FROM `product_siteprice` '
'WHERE `product_siteprice`.`price_id` = `product_price`.`id` '
'AND site_id=%s', [site.pk]
)
queryset = queryset.annotate(**site_annotations)
編集
私のモデルは次のように簡略化されて見え
Product | Nr of prices on Site A | Nr of prices on Site B |
--------|------------------------|------------------------|
Iphone | 6 | 3 |
Xperia | 42 | 66 |
そして私は、並べ替え、フィルタ処理したいです価格の数、なぜ私は注釈が必要なのですか。あなたはコンテキストの残りの部分がわからない場合
NB名前価格は、この文脈では、それはより多くの製品のように見ることができ、少し誤解を招くおそれがあり私が理解、あなただけの価格をフィルタリングする必要があるから
私の答えが間違っている場合は、モデルの関連部分を含めていただけますか? – Sayse
私は何をしたいかについてより多くの文脈を追加しました –
Iveが私の答えを更新しました – Sayse