【问题标题】:How to modify get_queryset result value如何修改 get_queryset 结果值
【发布时间】:2018-09-04 14:41:43
【问题描述】:

我正在尝试修改我的 get_queryset 结果

这是我的过滤器、视图和序列化器

view.py

 class AccountDetailFilter(filters.FilterSet):
        product_key = filters.CharFilter(name='product__product_name')
        account_name = filters.AllValuesFilter(name='account__account_key')
        service_provider_name = filters.CharFilter(name='product__service_provider__service_provider_name', )
        allocation_key = filters.CharFilter(name='account__account_allocation__allocation_key')

        class Meta:
            model = BillingLine
            fields = ('product_key', 'account_name', 'service_provider_name', 'allocation_key')

class AccountDetailList(generics.ListAPIView):
    serializer_class = BillingSerializer
    filter_backends = (DjangoFilterBackend,)
    filter_class = AccountDetailFilter


    def get_queryset(self):
        now = datetime.datetime.now()
        start_date = self.kwargs.get('start_date_time', now)
        end_date = self.kwargs.get('end_date_time', now)
        serializer = BillingSerializer(data={'start_date': start_date, 'end_date': end_date})
        serializer.is_valid(raise_exception=True)
        queryset = BillingLine.objects.select_related().filter(start_date__gte=start_date, end_date__lte=end_date)
        queryset =  queryset.order_by('-id')
        print(queryset.count())
        return queryset

Serializers.py

class BillingSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    start_date = serializers.DateTimeField()
    end_date = serializers.DateTimeField()
    account_key = serializers.CharField(source='account_id',required=False)
    product_key = serializers.CharField(source='product_id',required=False)
    total_amount = serializers.FloatField(required=False)

检索结果(即get_queryset)后,我需要修改/添加结果中的数据。有没有办法做到这一点。

我们还可以从结果查询集中获取其他字段值到序列化程序。因为queryset = BillingLine.objects.select_related().filter(start_date__gte=start_date, end_date__lte=end_date) 正在返回几乎所有数据(特别是产品表中的产品名称)

【问题讨论】:

  • 将所有键添加到从视图查询集返回的序列化程序中
  • @AnupYadav 我已经在查询返回的序列化程序中添加了字段。但它不起作用。只有主表中的字段在结果集中返回
  • 是的,您需要在类级别而不是 META 类中定义 field_name = serializers.IntegerField()field_name = serializers.CharField()。并且需要将这些字段添加到fieldsextra_fields = ('field_name','so on...')
  • @AnupYadav 我已经添加了
  • fieldsextra_fields = ('field_name','so on...') ?您的问题缺少此部分

标签: django python-3.x django-models django-rest-framework


【解决方案1】:

覆盖get_queryset() 方法将完美地满足您的目的。

例如: 在你的views.py

class AccountDetailList(generics.ListAPIView):
    serializer_class = BillingSerializer
    filter_backends = (DjangoFilterBackend,)
    filter_class = AccountDetailFilter
    def get_queryset(self):
        qs = YourModel.objects.filter(**filter_parameter)
        return qs

    def list(self):
        try:
            queryset = self.get_queryset()
            serialize_value = YourSerializers(queryset,many=True,context={'request': self.request}).data
            #Here in "serialize_value" you can append your data as much as you wish
            return_val = {
                'modified_serialize_value': serialize_value
            }    
            return Response(return_val, status=status.HTTP_200_OK, content_type='application/json')
        except Exception as E:
            return Response({'error': str(E)}, status=status.HTTP_408_REQUEST_TIMEOUT, content_type='application/json')

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-17
    • 2010-12-18
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 2018-09-20
    相关资源
    最近更新 更多