首页 > 解决方案 > django 序列化程序中的自定义查询

问题描述

我有以下视图,允许我为登录用户确定定义的价格并捕获用户请求的提供者模型的信息:

class ProductStoDists(mixins.ListModelMixin, generics.GenericAPIView):
       permission_classes = (permissions.IsAuthenticated,IsSavedRole)
       queryset = SellProduct.objects.select_related("provider", "product", "coupon_percentage", "coupon_quality").filter(~Q(stock = None), Q(disabled_sale=False))
       serializer_class = SellProductSerializer
       parser_classes = (MultiPartParser,)
       filter_backends = [DjangoFilterBackend, filters.SearchFilter]
       filterset_fields = ["product", "provider", "provider__state_prin_venue", "product__sectors", "product__categories", "provider__type_provider"]
       pagination_class = Pagination

def get(self, request, *args, **kwargs):
    return self.list(request, *args, **kwargs)

#@method_decorator(cache_page(60*60))
#@method_decorator(vary_on_cookie)
def list(self, request, *args, **kwargs):
    queryset = self.filter_queryset(self.get_queryset())
    page = self.paginate_queryset(queryset)
    entity = Provider.objects.filter(administrator=request.user)
    data_price = []
    if page is not None:
        serializer = self.get_serializer(page, many=True)
        object_dataset = DataSetIds()
        if request.user.role != "lab":
            prices = []
            for sell_product_cost in serializer.data:
                provider = Provider.objects.filter(id_provider=sell_product_cost["provider"]).select_related("country_prin_venue", "state_prin_venue", "city_prin_venue", "administrator")
                price_object = CustomPrices(entity, request.user.id, provider)
                if provider[0].type_provider == "dist":
                    if request.user.role == "dist" or request.user.role == "sto":
                        sell_product_cost["distributors"] = price_object.get_sell_distributors(sell_product_cost["id_sell"])
                    else:
                        sell_product_cost["distributors"] = None
                else:
                    if request.user.role == "sto":
                        sell_product_cost["storage"] = price_object.get_sell_storage(sell_product_cost["id_sell"])
                    else:
                        sell_product_cost["storage"] = None

        return self.get_paginated_response(serializer.data)
    serializer = self.get_serializer(queryset, many=True)
    return Response(serializer.data)

我怎样才能从序列化程序而不是视图中完成“存储”或分销商字段?因为我认为这会减慢客户服务的响应速度。

标签: djangodjango-modelsdjango-rest-framework

解决方案


在不知道您的模型定义的情况下,答案可能涉及在 SQL 构建器级别执行此工作,而不是在查询数据之后。如果你不能,那么这表明存在限制应用程序能力的架构问题。

例如,假设您的SellProduct模型有一个外键Provider. 如果您需要有条件地向查询集添加信息,那么您可以使用annotateCase

queryset = self.filter_queryset(self.get_queryset())
queryset = queryset.select_related('provider') \
                   .annotate(
                     distributors=Case(
                       When(provider__type_provider='dist', then=Value('foo')),
                       default=Value('other foo'),
                       output_field=CharField()
                   )

但是,如果您依赖 python 方法为从查询集返回的每个实例填充信息位,那么您需要重新评估您的模型结构并确定您是否可以更好地关联信息以避免这种情况。


推荐阅读