【问题标题】:DRF pass the URL parameter into serizalizerDRF 将 URL 参数传递给序列化程序
【发布时间】:2021-06-20 18:43:43
【问题描述】:

我们可以将 URL 查询集参数传递给 serizalizer 进行过滤/计算吗?

这是我的终点:?start_date=20210312&end_date=20210317

这里是我的视图集:

class BrandChartsViewSet(ModelViewSet):
serializer_class = BrandChartsSerializer
pagination_class = BrandChartsPagination

queryset = Brand.objects.all()

def get_queryset(self):
    start_date = self.request.query_params.get('start_date',None)
    end_date = self.request.query_params.get('end_date',None)
    if start_date is None:
        raise InvalidInputError()
    if end_date is None:
        raise InvalidInputError()

    start_date_obj = datetime.strptime(start_date,'%Y%m%d')
    end_date_obj = datetime.strptime(end_date,'%Y%m%d')

    serializer = BrandChartsSerializer(start_date_obj,end_date_obj)
    queryset = Brand.objects.all()

    return queryset

这是我的序列化器:

class BrandChartsSerializer(serializers.ModelSerializer):
rankings = serializers.SerializerMethodField()
instagram = IGSerializer(allow_null=True)
facebook = FBSerializer(allow_null=True)
hashtags = BrandHashtagSerializer(allow_null=True, many=True)
# rename the json field
brand_uid = serializers.IntegerField(source='id')
brand_name = serializers.CharField(source='name')
origin = serializers.CharField(source="country")

class Meta:
    model = Brand
    fields = [
        "brand_uid",
        "brand_name",
        "origin",
        "rankings",
        "instagram",
        "facebook",
        "hashtags",
    ]

def get_rankings(self, instance):
    rank = instance.rankings.all().filter(created__gte=start_date_obj,
                                          created__lte=end_date_obj
                                          ).order_by('created')
    return BrandRankSerializer(rank, allow_null=True, many=True).data

它会在get_rankings 中有Unresolved reference 'start_date_obj' ,但是我尝试通过class BrandChartsSerializer(serializers.ModelSerializer,start_date_obj,end_date_obj) 将参数传递给序列化器

还是报错。

由于我的功能设计,我认为它无法使用 DRF 过滤器来处理它,我可以将参数传递给 serizalizer 进行过滤吗? (我需要过滤范围内的排名模型并计算总和而不是返回)

【问题讨论】:

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


【解决方案1】:

在这种情况下,我们可以利用上下文。

试试这个。

更新get_rankings 方法。

def get_rankings(self, instance):
    start_date_obj = self.context.get("request").query_params.get("start_date")
    end_date_obj = self.context.get("request").query_params.get("end_date")
    rank = instance.rankings.all().filter(created__gte=start_date_obj,
                                          created__lte=end_date_obj
                                          ).order_by('created')
    return BrandRankSerializer(rank, allow_null=True, many=True).data

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-07-25
  • 1970-01-01
  • 2023-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-05
相关资源
最近更新 更多