Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如何将自定义字段添加到queryset并进行排序_Django_Django Queryset - Fatal编程技术网

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

Django 如何将自定义字段添加到queryset并进行排序,django,django-queryset,Django,Django Queryset,我有产品型号,我的产品没有可用数量和价格字段,因为这些字段在其他服务中。因此,我在查询集中添加了自定义字段 这是我的密码 for product in queryset: product.info_bundle = { 'available_quantity': stock_info.get(product.stock_code), 'prices': 100, } 我将我的自定义info\u bundle字段添加到queryset 问题是;我

我有
产品
型号,我的产品没有
可用数量
价格
字段,因为这些字段在其他服务中。因此,我在查询集中添加了自定义字段

这是我的密码

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

我将我的自定义
info\u bundle
字段添加到queryset

问题是;我无法使用
queryset.order\u by('available\u quantity')
进行订购,因为我添加了此项。它不是来自数据库,因此SQL无法找到该字段

你不能那样做

在DB级别执行,它仅在DB字段注释字段上操作


SO帖子中也提到了类似的问题,

您不能使用从第三方服务获得的字段在db级别进行排序。对于您的需求,您需要在内存中进行排序。但正如您所建议的,当您这样做时,您将queryset转换为一个列表。如果我理解正确,您正在使用DRF并在get_queryset方法中进行排序。因此,这里想到了以下方法:

  • (解决方法)从get_queryset方法返回列表,但覆盖使用get_queryset方法的视图的其他方法,并使它们使用列表而不是queryset
  • (解决方法)不要在get_queryset方法中进行排序,而是重写list方法,并在返回响应之前在内存中对结果进行排序
  • 在视图中使用自定义排序过滤器。另外两个是变通方法,但通过这种方法,您可以构建一个符合DRF一般流程的解决方案。不过,在这里您可能会遇到相同的问题,因为您在排序时会将查询集转换为列表

  • 您可以将此查询集转换为字典数组,每个项中都包含此“自定义字段”。像这样:

    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
    
    因此,您可以按照dictionary字段对数组进行排序。像这样:

    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
    
    现在,您的列表已按自定义字段排序


    我希望我能帮助您。

    可担保数量来自哪里?您是否将其存储在另一个型号的数据库中?因此,您可以对查询集进行注释,以便为每个结果包含Available_quantity字段,然后按其排序。如果没有,则需要在内存中进行排序。@OzgurAkcali Available_数量来自另一个web服务。它独立于模型和数据库。当我在内存中排序时,我应该将queryset转换为list,在get_queryset方法中,我不能返回list,因此我应该返回queryset。