Skip to main content
 首页 » 编程设计

python之向 Django QuerySet 添加值

2024年12月31日25TianFang

有什么方法可以将非 Django 提供的值附加到查询中吗?

例如,要查明一家商店是否关门,我可以运行一个名为 get_closed_stores() 的函数,它会返回一个已关门商店的列表。

商店关门

[00090, 00240, 00306, 00438, 03005, 05524] 

太好了,现在我们有了关门商店的商店编号。让我们获取那些实际的商店对象。

查询

Store.objects.filter( 
store_number__in=[00090, 00240, 00306, 00438, 03005, 05524] 
) 

我们现在有了 QuerySet,但我们绝对无法检测商店何时关闭,因为数据库不包含任何有关紧急关闭的信息,但 Sharepoint 包含。因此,返回 get_closed_stores(),我们可以返回关闭日期以及商店编号,这样我们的关闭商店列表(字典)看起来更像下面这样:

带日期的商店列表

{ 
    [00090, '1/28/19 5:00PM'],  
    [00240,'1/28/19 5:00PM'],  
    [00306, '1/28/19 5:00PM'],  
    [00438,'1/28/19 5:00PM'],  
    [03005,'1/28/19 5:00PM'],  
    [05524, '1/28/19 5:00PM'] 
} 

既然日期是我的商店编号,我可以将其添加到我的查询集中(理想情况下)并从我的前端访问它。

所以如果我正在处理与 Django ORM 相关的任何事情,那么 annotate() 在这里将是理想的选择,但是当涉及到“注入(inject)”外部数据时,我在寻找什么?

我绝对可以在我的前端从 JS 调用每个商店,但如果我能绕过它,我宁愿不调用

请您参考如下方法:

A QuerySet 本身并没有什么神奇或特殊的东西,最终它仍然是一个字典,所以我有随机的想法以这种方式附加到字典我通常会这样做,而且它奏效了。

我的函数现在返回一个字典:

{ "store_number": "close_date" } 

我的 View 采用此字典并使用键(商店编号)查询数据库,然后将商店的关闭日期附加为 store.close_date,只需说:

store.close_date = store_list[store_number] 

这可能会改变,但我想让它与原始问题保持接近,以便 future 的读者可以阅读。以下是我的看法。

@login_required 
def store_closures(request): 
    store_list = get_closed_stores() 
    store_nums = store_list.keys() 
    closed_stores = Store.objects.filter(store_number__in=store_nums) 
    for store in closed_stores: 
        store.close_date = store_list["{:05d}".format(store.store_number)] 
    return render(request, 'all_store_closures.html', {'closed_stores':closed_stores}) 

因此,如果您想将非 Django 值添加到查询集中,您只需使用附加到字典的标准方法即可。

for obj in query: 
    obj.desired_name = 'desired_value' 

当然,这是使用模板中的 {{ object.desired_name }} 访问的。