如何将自定义字段添加到queryset并进行排序

时间:2019-03-13 08:45:09

标签: django django-queryset

我有Product模型,而我的产品没有available_quantityprices字段,因为这些字段在另一个服务中。因此,我在查询集中添加了自定义字段。

这是我的代码;

for product in queryset:
    product.info_bundle = {
        'available_quantity': stock_info.get(product.stock_code),
        'prices': 100,
    }

我将自定义info_bundle字段添加到queryset。

问题是;我无法通过queryset.order_by(‘avaliable_quantity’)订购,因为我添加了此内容。它不是来自数据库,因此SQL无法找到该字段。

3 个答案:

答案 0 :(得分:1)

您无法使用从第三方服务获得的字段在数据库级别上进行排序。根据您的要求,您需要在内存中排序。但是,正如您所建议的那样,您可以将查询集转换为列表。如果我理解正确,那么您正在使用DRF并在get_queryset方法中进行此排序。因此,在这里想到以下方法:

  1. (解决方法)从get_queryset方法返回一个列表,但覆盖使用get_queryset方法的视图的其他方法,并使它们与列表一起使用而不是查询集
  2. (解决方法)不要在get_queryset方法中进行排序,而是覆盖 list 方法,并在返回结果之前在内存中对结果进行排序。
  3. 在视图中使用自定义排序过滤器。其他两个是解决方法,但是使用这种方法,您有可能可以构建与DRF的总体流程一致的解决方案。不过,您可能会在这里遇到同样的问题,因为您将在排序时将查询集转换为列表。

答案 1 :(得分:0)

你不能那样做。

order_by()在数据库级别执行,并且只能在 db字段 带注释的字段 < / strong>。

SO帖子Filter a Django model property

中也提到了类似的问题

答案 2 :(得分:0)

您可以将此查询集转换为字典数组,并在每个项目中使用此“自定义字段”。像这样:

products = []
for product in queryset:
    products.append({
        "product" = product,
        "available_quantity" = stock_info.get(product.stock_code),
        "prices" = 100
    })

那么你可以通过字典字段对数组进行排序。像这样:

new_sorted_list = sorted(products, key=lambda d: d["available_quantity"], reverse=True) 

# You can avoid the reverse parameter, it's for ASC or DESC results

现在您的列表已按自定义字段排序。

希望我能帮到你。