django - 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)
我怎样才能从序列化程序而不是视图中完成“存储”或分销商字段?因为我认为这会减慢客户服务的响应速度。
解决方案
在不知道您的模型定义的情况下,答案可能涉及在 SQL 构建器级别执行此工作,而不是在查询数据之后。如果你不能,那么这表明存在限制应用程序能力的架构问题。
例如,假设您的SellProduct
模型有一个外键Provider
. 如果您需要有条件地向查询集添加信息,那么您可以使用annotate
和Case
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 方法为从查询集返回的每个实例填充信息位,那么您需要重新评估您的模型结构并确定您是否可以更好地关联信息以避免这种情况。
推荐阅读
- javascript - 移动模式下的文本无法自我修复
- javascript - Gremlin 在 javascript AWS Lambda 中获得计数
- javascript - JavaScript 引导程序不起作用
- java - 如何在 pl/pgsql 中创建返回 refcursor 和 totalRow 的函数/过程?
- javascript - 纠正这个for循环?
- android - 重新映射设备电源按钮以显示对话框
- node.js - 如何按顺序解构多个查询结果?
- c# - 是否可以在单个 API 调用中从 Azure Blob 存储中检索多个 Blob?
- linux - Linux Pipe 命令是否需要一个进程来执行?
- php - PHP递归树视图生成器仅从填充的“选定”数组中选择一个选项?