将值添加到Django QuerySet

时间:2019-01-29 00:48:03

标签: python django django-2.0 django-2.1

是否可以将非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']
}

现在日期与我的商店编号一致,我可以将其理想地添加到我的Queryset中,并从前端访问它。

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

我绝对可以从前端的JS拨打每个商店的电话,但是我宁愿绕开它

2 个答案:

答案 0 :(得分:1)

这是一个丑陋的解决方案,但是仍然是一个解决方案(我将在实际代码中进行清理)。

QuerySet 本身并没有什么魔力或特殊之处,最后它仍然是字典,因此我有随机的概念将其附加到字典中我通常会这样做,并且有效。

我的函数现在正在返回字典:

{ "store_number": "close_date" }

我的视图使用此词典,并使用键(商店编号)查询数据库,然后通过简单地说:

将商店的关闭日期附加为store.close_date
store.close_date = store_list[store_number]

这可能会改变,但我想使其与原始问题保持接近,以使将来的读者可以阅读。下面是我的看法。

@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 }}来访问哪个。

答案 1 :(得分:-1)

您还没有看到完整的代码 但是请查看您是否使用以下方式正确地装订了上下文:

context = {}

books = Books.objects.all()

context ['books'] =图书