向 Django QuerySet 添加值

Cod*_*ent 3 python django django-2.0 django-2.1

有没有办法将非 Django 提供的值附加到查询中?

例如,要确定商店是否关闭,我可能会运行一个名为的函数get_closed_stores(),该函数返回已关闭商店的列表。

商店关门

[00090, 00240, 00306, 00438, 03005, 05524]
Run Code Online (Sandbox Code Playgroud)

太好了,现在我们有已关闭商店的商店编号。让我们得到那些实际的商店对象。

询问

Store.objects.filter(
store_number__in=[00090, 00240, 00306, 00438, 03005, 05524]
)
Run Code Online (Sandbox Code Playgroud)

我们现在有了 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']
}
Run Code Online (Sandbox Code Playgroud)

现在日期与我的商店编号一起,我可以将它添加到我的查询集(理想情况下)并从我的前端访问它。

因此annotate(),如果我正在使用与 Django ORM 相关的任何内容,那么这里将是理想的选择,但是当谈到“注入”外部数据时,我在寻找什么?

我绝对可以在我的前端从 JS 为每个商店打电话,但如果我能绕过它,我宁愿不这样做

Cod*_*ent 7

一个查询集本身并没有什么神奇或特殊,到底它还是一本字典,所以我只好随机概念追加到词典中的方式,我通常的做法,和它的工作。

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

{ "store_number": "close_date" }
Run Code Online (Sandbox Code Playgroud)

我的视图使用这本字典并使用键(商店编号)来查询数据库,然后附加商店的关闭日期store.close_date,只需说:

store.close_date = store_list[store_number]
Run Code Online (Sandbox Code Playgroud)

这可能会改变,但我想让它接近原始问题,以使其对未来的读者可读。下面是我的看法。

@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})
Run Code Online (Sandbox Code Playgroud)

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

for obj in query:
    obj.desired_name = 'desired_value'
Run Code Online (Sandbox Code Playgroud)

当然,这是{{ object.desired_name }}从您的模板访问的。