【问题标题】:Adding values to Django QuerySet向 Django QuerySet 添加值
【发布时间】:2019-06-22 01:38:51
【问题描述】:

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

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

商店关闭

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

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

查询

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']
}

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

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

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

【问题讨论】:

    标签: python django django-2.0 django-2.1


    【解决方案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 }} 访问。

    【讨论】:

      猜你喜欢
      • 2015-10-12
      • 2014-10-08
      • 1970-01-01
      • 2012-02-04
      • 1970-01-01
      • 2020-12-12
      • 2020-11-29
      • 2021-01-18
      • 2011-03-24
      相关资源
      最近更新 更多