2017-09-28 9 views
0

クエリの結果に集計操作を追加し、私のモデルは以下のとおりです。ジャンゴ私はジャンゴを使用して2つのテーブル間の集約演算をやろうとしている

class Cusinetype(models.Model): 
    hometype_en = models.TextField() 
    active = models.BooleanField() 
    hometype_es = models.TextField(blank=True, null=True) 

    class Meta: 
     managed = False 
     db_table = 'cusinetype' 

class Foodpreferences(models.Model): 
    id_client = models.ForeignKey(Client, models.DO_NOTHING, db_column='id_client') 
    id_cusinetype = models.ForeignKey(Cusinetype, models.DO_NOTHING, db_column='id_cusinetype') 
    created_at = models.DateTimeField() 

    class Meta: 
     managed = False 
     db_table = 'foodpreferences' 

私が構築しようとしているクエリは次のとおりです。

SELECT 
    ct.id, 
    ct.hometype_en, 
    ct.hometype_es 
    , 
    ((SELECT COUNT(*) 
     FROM foodpreferences fp 
     WHERE fp.id_cusinetype = ct.id AND fp.id_client = 3 ) > 0) selected 
FROM 
    Cusinetype ct 

私はモデルを生成しようとしています。これらのテーブルの情報を1つのクエリに格納しようとしていますが、何かが動作します。 誰かがそれを行う方法について考えていますか?このソリューションの

答えて

0

serializers.py

class PreferencesSerializer(serializers.ModelSerializer): 
    selected = serializers.IntegerField() 

    class Meta: 
     model = Cusinetype 
     fields = ('id', 'trucktype_en', 'trucktype_es', 'selected') 

views.py

qs = Cusinetype.objects.filter().filter(active = True) 
      qs = qs.annotate( 
       selected=Sum(Case(
        When(foodpreferences__id_client=3, then=1), 
        output_field=IntegerField() 
       )) 

      ) 
     serializers = PreferencesSerializer(qs, many = True) 
     return Response({ "result": serializers.data }) 
+1

結果は正しいですが、クエリは、SQLの例では予想よりもはるかに遅いクエリを使用しています。あなたはすべてのクライアントのFoodpreferencesを読んでいます。 [Exists()サブクエリ](https://docs.djangoproject.com/en/1.11/ref/models/expressions/#exists-subqueries)を使用することをお勧めします。この例は非常に似ているので、それ以上のコメントは必要ありません。そこにもっと良い解決策を入れてそれを受け入れることは賢明でしょう。 – hynekcer

関連する問題