2017-09-28 1 views
0

내가 장고를 사용하여 두 테이블 사이의 집계 작업을 할 노력하고있어에 집계 작업을 추가, 내 모델은 다음과 같습니다장고는 쿼리 결과

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 

하나의 쿼리에 해당 테이블의 정보를 저장하려고 모델을 생성하려고하는데 아무 것도 작동하지 않습니다. 누군가 어떻게하는지에 대해 알고 있습니까? 이 솔루션의

답변

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