Python 丰富Django QuerySet不同的结果

Python 丰富Django QuerySet不同的结果,python,django,django-queryset,Python,Django,Django Queryset,目标 查询所有产品,对其进行切片,返回这些产品的子集,并添加一个键:value,换言之,是丰富的 有效但我无法使用的代码 我无法使用此代码,因为我使用了分页器,分页器将访问QuerySet的count。如果我传递了切片查询集,那么该计数只针对该切片部分,而不是整个查询集,因此我不能使用它 products_qs = final_qs[paginator.get_offset(request): paginator.get_offset(request

目标

查询所有产品,对其进行切片,返回这些产品的子集,并添加一个
键:value
,换言之,是丰富的

有效但我无法使用的代码

我无法使用此代码,因为我使用了分页器,分页器将访问
QuerySet
count
。如果我传递了切片查询集,那么该计数只针对该切片部分,而不是整个
查询集
,因此我不能使用它

products_qs = final_qs[paginator.get_offset(request):
                       paginator.get_offset(request) + paginator.get_limit(request)]
for product in products_qs:
    product.raw['super_cool_new_key'] = ms_response.get('results').get(product.id)
这非常有效,当我打印数据时,我可以在每个产品中看到
super\u cool\u new\u key
丰富内容。令人惊叹的。问题好吧,我不得不对它进行切片,现在count方法不再适用。当然,我可以这样做:

products_qs.count = final_qs.count
继续我的生活,但感觉。。。哈奇,或许不是

代码我希望它能正常工作,但没有

for i in range(paginator.get_offset(request),
               paginator.get_offset(request) + paginator.get_limit(request)):
    product = final_qs[i]
    product.raw['super_cool_new_key'] = ms_response.get('results').get(product.id)
当我看到数据输出时,
super\u cool\u new\u键不在那里。我不知道为什么

也许我今天心情不好,不明白如何通过引用访问,所以我删除了middlemonkey

final_qs = final_qs.all()
for i in range(paginator.get_offset(request),
               paginator.get_offset(request) + paginator.get_limit(request)):
    final_qs[i].raw['super_cool_new_key'] = ms_response.get('results').get(final_qs[i].id, '')
怀疑

很明显,代码差异是一种方法有效而另一种方法无效的罪魁祸首。我的美元如下:

from django.db.models import When, Case, Value, CharField

ms_response = {5458: 'abc', 9900: 'def'}
whens = [
    When(id=k, then=Value(v)) for k, v in ms_response.items()
]
qs = YourModelName.objects.all().annotate(
    super_cool_key=Case(
        *whens,
        default=Value('xyz'),
        output_field=CharField()
    )
)
  • 切片
  • 迭代
研究:

迭代。QuerySet是可编辑的,当您第一次迭代它时,它会执行它的数据库查询

然后关于切片:

切片。如限制查询集中所述,可以使用Python的数组切片语法对查询集进行切片。切片一个未赋值的查询集通常会返回另一个未赋值的查询集,但是如果使用切片语法的“step”参数,Django将执行数据库查询,并返回一个列表

我不能做切片,因为我不做带有“step”参数的切片。由于它返回一个未赋值的QuerySet我想要使用的代码,理论上应该可以使用。(不是一直都是这样吗?哈哈)

好的,这样就澄清了这样一个事实:在编码的第一个选项中,我对x_容器中的x进行了
迭代,执行了
QuerySet
。这就是答案吗?所以我修改了代码:

扰流板警报:仍然不起作用

final_qs = final_qs.all()
for i in range(paginator.get_offset(request),
               paginator.get_offset(request) + paginator.get_limit(request)):
    product = final_qs[i]
    product.raw['super_cool_new_key'] = ms_response.get('results').get(product.id)
from django.db.models import When, Case, Value, CharField
when = [ When(id=k, then=Value(v)) for k,v in ms_response.get('results').items()]
p = final_qs[paginator.get_offset(request)
             :paginator.get_offset(request) + paginator.get_limit(request)]
p = p.annotate(super_cool_new_key=Case(
            *when,
            default=Value(''),
            output_field=CharField()
        )
    )
嗯。。。帮忙

一个建议的答案,即扰流板警报无效

final_qs = final_qs.all()
for i in range(paginator.get_offset(request),
               paginator.get_offset(request) + paginator.get_limit(request)):
    product = final_qs[i]
    product.raw['super_cool_new_key'] = ms_response.get('results').get(product.id)
from django.db.models import When, Case, Value, CharField
when = [ When(id=k, then=Value(v)) for k,v in ms_response.get('results').items()]
p = final_qs[paginator.get_offset(request)
             :paginator.get_offset(request) + paginator.get_limit(request)]
p = p.annotate(super_cool_new_key=Case(
            *when,
            default=Value(''),
            output_field=CharField()
        )
    )

我还尝试了不使用切片的方法,但使用了
.all().annotate()
。还是不行。它不起作用,不是因为发生了异常,而是因为当我看到输出时,
super\u cool\u new\u key
不在那里,这意味着它没有丰富对象,这就是关键所在。

听起来好像你要找的与使用和的答案相似。供您使用的内容如下:

from django.db.models import When, Case, Value, CharField

ms_response = {5458: 'abc', 9900: 'def'}
whens = [
    When(id=k, then=Value(v)) for k, v in ms_response.items()
]
qs = YourModelName.objects.all().annotate(
    super_cool_key=Case(
        *whens,
        default=Value('xyz'),
        output_field=CharField()
    )
)

当您调用<代码> qs.GET(id=5458)。SufxIoCulyKix</C> >它将返回<代码> ABC

您会考虑访问模板中的MSY响应吗?因此,只要您需要结果,就可以根据模板中的product.id访问ms_响应,而不用担心将两者合并。这样,您的查询集就保持为一个查询集,您不必担心分页在当前项目中不可能,没有模板,一个端点需要将所有这些信息很好地打包到JSON中。您好!我确实尝试过它,并在过程中了解了When/cases,但它不起作用:(我正在更新我当前的问题,以包含新的代码。是否愿意分享您的错误消息?如果没有更多详细信息,很难说为什么它不起作用哦,没有错误,它执行得很好,但我没有看到新的“super\u cool\u key”在输出上。您如何尝试“在输出上”访问它?这是一个经过测试的功能性答案。请提供有关如何访问输出的更多信息