2012-03-21 19 views
0
class Review(models.Model): 
    slug = models.SlugField(max_length=255, unique=True) 
    vendor = models.ForeignKey(Vendor) 
    user = models.ForeignKey(User, blank=True, null=True) 
    product = models.ForeignKey(Product, blank=True, null=True) 
    images = models.ManyToManyField(ReviewImage, blank=True, null=True) 
    headline = models.CharField(max_length=100) 
    review = models.TextField(blank=True, null=True) 
    rating = models.IntegerField() 
    active = models.BooleanField(default=1) 
    created = models.DateTimeField(auto_now_add=True) 
    changed = models.DateTimeField(auto_now=True) 

# This is the problem... I works, but no vendor is shown if there is no review. 
vendor_list = (Vendor.objects.filter(category=category, 
            review__product__isnull=True, 
            active=True) 
       .annotate(rating_avg=Avg('review__rating'))) 

どうすればreview__product__isnull=Trueとすることができますか?レビューが全くない場合、私はまだベンダーが欲しいですが、レーティングは "0"、何をすべきか?アノテーション付きDjangoフィルタ

+1

http://stackoverflow.com/questions/553038/treat-null-as-0-in-django-model –

+0

の可能性のある重複しないだろうあなたがしようとしていることを詳述できますか?あなたがレビューなしにベンダーを得ようとしているようだが、Avgの使用は混乱しているようだ。 – jpic

+0

カテゴリのすべてのベンダーをリストにして、それぞれの評価を表示したいのですが、「製品」が選択されていない評価のみが必要です。助けてくれてありがとう! – pkdkk

答えて

1

私がこれを理解しているかどうかを見てみましょう。カテゴリの中にあるすべてのアクティブなベンダーを一覧表示しようとしており、レビューの平均評価が注釈されています。レビューが商品レビューではなくベンダーレビューであると判断する方法は、商品フィールドがnullであることです。また、レビューのないベンダーの平均格付けをゼロにしたいとします。

SQLでクエリはOUTER JOINが必要です。

ジャンゴで時々
SELECT vendor.id, COALESCE(AVG(review.rating), 0.0) AS rating 
    FROM myapp_vendor AS vendor 
    LEFT OUTER JOIN myapp_review AS review 
    ON review.vendor_id = vendor.id 
     AND review.product IS NULL 
    WHERE vendor.category = %s 
    AND vendor.active 
    GROUP BY vendor.id 

最も簡単な解決策はraw SQL queryある:開発者が言うように、データベースAPIは、「a shortcut but not necessarily an end-all-be-all.」であることは、このようになりますので:

for v in Vendor.objects.raw('SELECT ... ', [category]): # query as above 
    print 'Vendor {0} has rating {1}'.format(v.name, v.rating) 
+0

まさに私が探していたもの...ありがとう;)...私の "product"/"ベンダー"のレビューソリューションは最高のものですか?、それを1つのテーブルに保存するには? 。 – pkdkk

0

OKここで間違っている可能性があります。私は小さなテストをして、それは私に正しい結果を与えたが、私はテストに多くの時間を費やす必要があり、私は今それを持っていない。

あなたはこれを試みることができる:

​​

(フィルタは読みやすくするために2行に分割されていますが、合併することができる)アイデアは、あなたが最初にすべてのベンダーを取るということです

製品のレビューがない、またはレビューが全くないユーザーをフィルタリングします。次にそれらに注釈を付けます。

レビューを逃したベンダーの格付けはいずれも0でない

関連する問題