2016-08-11 2 views
1

관련 모델에서 필드를 직렬화하는 방법.Django Rest Framework 프레임 크기 조절

class Order(models.Model): 
    order_id = models.BigIntegerField(verbose_name='Order ID', unique=True) 
    order_name = models.CharField(verbose_name='Order name', max_length=255) 
    order_type = models.IntegerField(verbose_name='Campaign type') 

class Types(models.Model): 
    delimiter = models.CharField(verbose_name='Delimiter', max_length=255) 
    status = models.BooleanField(verbose_name='Status', default=True) 
    title = models.CharField(verbose_name='Title', max_length=255) 

class User(models.Model): 
    name = models.CharField(verbose_name='User name', max_length=200, unique=True) 

class Report(models.Model): 
    order = models.ForeignKey(Order, to_field='order_id', verbose_name='Order ID') 
    user = models.ForeignKey(User, verbose_name='User ID') 
    ad_type = models.ForeignKey(Types, verbose_name='Type') 
    imp = models.IntegerField(verbose_name='Total imp') 
    month = models.DateField(verbose_name='Month', default=datetime.datetime.today) 

보기 :

class ReportLisAPIView(ListAPIView): 
    serializer_class = ReportSerializer 

    def get_queryset(self): 
     month = parse_date(self.kwargs['month']) - relativedelta(day=1) 

     queryset = (
      Report.objects.filter(month=month) 
      .values_list(
       'user', 'user__name', 'order__order_id', 
       'order__order_name', 'order__order_type' 
      ).all().annotate(Sum('imp')) 
     ) 
     return queryset 

시리얼 : 나는 get_queryset에 '의 검색어'처럼 모든 필드를 얻을 필요가

class ReportSerializer(ModelSerializer): 

    class Meta: 
     model = Report 
     depth = 1 

()

은 내가 모델을 가지고 오류가 발생했습니다.

Got AttributeError when attempting to get a value for field imp on
serializer ReportSerializer . The serializer field might be named incorrectly and not match any attribute or key on the tuple instance. Original exception text was: 'tuple' object has no attribute 'imp'.

그러나 get_queryset()에서 반환하면 Report.objects.filter (월 = 월) .all() 모든 개체 및 모든 필드와 관련된 개체를 가져올거야, imp 및 그룹화 집계없이.

그래서 질문은 queryset에 설정된 serializer 반환 구조를 만드는 방법입니까?

답변

1

get_queryset 메서드는 쿼리 세트를 반환해야하지만 values_list 인 튜플 beacause를 반환해야합니다. 드롭 다운하여 쿼리 세트를 반환하거나 APIView과 같은보다 일반적인보기로 이동하십시오.

0

나는 그것을하는 방법을 발견했다.

.values_list()를 사용하면 쿼리 개체 대신 목록 개체가 반환됩니다. 그래서 serializer에 대해 내가 serializer의 모든 필드를 정의한 목록 안에 무엇이 있는지 이해합니다. 그리고 to_representation()에서 나는 그것이 있어야하는 것처럼 사전을 반환합니다.

시리얼 :

class ReportSerializer(serializers.ModelSerializer): 
    user = serializers.IntegerField() 
    user_name = serializers.CharField() 
    order_id = serializers.IntegerField() 
    order_name = serializers.CharField() 
    order_type = serializers.IntegerField() 
    imp = serializers.IntegerField() 

class Meta: 
    model = Report 
    fields = [ 
     'user', 'user_name', 'order_id', 'order_name', 
     'order_type', 'imp' 
    ] 
    depth = 1 

def to_representation(self, instance): 
    Reports = namedtuple('Reports', [ 
     'user', 
     'user_name', 
     'order_id', 
     'order_name', 
     'order_type', 
     'imp', 
    ]) 
    return super(ReportSerializer, self).to_representation(
     Reports(*instance)._asdict() 
    ) 

보기 :

class ReportLisAPIView(ListAPIView): 
    serializer_class = ReportSerializer 

    def get_queryset(self): 
     month = parse_date(self.kwargs['month']) - relativedelta(day=1) 

     queryset = (
      Report.objects.filter(month=month) 
      .values_list(
       'user', 'user__name', 'order__order_id', 
       'order__order_name', 'order__order_type' 
      ).all().annotate(Sum('imp')) 
     ) 
     return queryset 

    def list(self, *args, **kwargs): 
     queryset = self.get_queryset() 
     serializer = self.serializer_class(queryset, many=True) 
     # actualy that's it! part of which is below can be pass and just 
     # return Response(serializer.data) 

     result = { 
      'month': parse_date(self.kwargs['month']).strftime('%Y-%m'), 
      'reports': [] 
     } 

     inflcr = {} 
     for item in serializer.data: 
      inflcr.setdefault(item['user'], { 
       'id': item['user'], 
       'name': item['user_name'], 
       'campaigns': [] 
      }) 

      orders = { 
       'id': item['order_id'], 
       'name': item['order_name'], 
       'type': item['order_type'], 
       'impressions': item['imp'], 
      } 

      inflcr[item['user']]['campaigns'].append(orders) 
     result['reports'] = inflcr.values() 

    return Response(result) 
+0

설명 ... – marcusshep

+0

죄송합니다. 내 대답에 설명을 추가했습니다. – user2160537

관련 문제