【问题标题】:Check if not exists in django model queryset检查 django 模型查询集中是否不存在
【发布时间】:2021-01-05 02:03:58
【问题描述】:

假设我有一个看起来像这样的表

col1 col2
1    completed
2    error
3    inititated
4    error
5    completed
6    error
7    completed

现在我在 django 中有这样的查询:

Model.objects.filter(col1__in=[1,2,8]).values('col2')

这个查询运行良好,但我想要做这样的事情: 返回 col2 的“待处理”,其中 col1 不在上述列表中 即为 8 返回“待处理”,因为它不在表中,而为 1 和 2 返回“已完成”和“错误”

【问题讨论】:

  • 我认为这不可能通过单个查询来实现。可能的方法是编写自己的models.Manager。也许你可以看看这里得到一些想法:stackoverflow.com/a/20674112/6705092
  • Thanx,但我仍然怀疑在不存在的 postgresql 中是否有可能
  • 我会亲自在表 tbh 中添加待处理状态,这是我通常做这类事情的方式。
  • 嗨@BrankoRadojevic 我很欣赏你的个人意见,但想想一个情况,当挂起状态比其他状态更常见时,那么我们只是无缘无故地增加数据库大小?
  • 好吧,如果挂起状态总是最后一个,那毕竟不是很常见,不是吗?有了它,您可以获得非常干净的数据库查询。当然,您可以随意尝试其他方法,但这种方法可能是最简单的。

标签: python django postgresql


【解决方案1】:

我认为需要在 Python 中完成一些处理,可能是这样的:

col1_list = [1, 2, 8]

# build a dict, so you can easily look up which 'col1' are present in the table
result_dict = {
    c1: c2
    for c1, c2 in Model.objects.filter(col1__in=col1_list)
        .values_list('col1', 'col2')
        .order_by('col1')}
print(result_dict)
# {1: 'completed', 2: 'error'}

# now build the full list and return 'pending' if 'col1' is not in table/dict
result_list = [
    (
        c1,
        result_dict.get(c1, 'pending')
    )
    for c1 in col1_list]
print(result_list)
# [(1, 'completed'), (2, 'error'), (8, 'pending')]

这相当快,因为​​它只有一个查询;唯一的缺点是 Python 开销,但由于它仅适用于字符串和整数(不是对象)的两列,因此不应该太耗费时​​间/内存。

【讨论】:

  • 嗨@Ralf 这种方法实际上是正确的,但我想要一种数据库方法,因为数据库级别的处理速度很快。如果我错了纠正我 。目前我正在创建一个默认值状态为pending的熊猫数据框,然后从查询集创建数据框,然后执行 dataframe.update(queryset_dataframe) 。感谢您的尝试,我支持它,但正在等待任何数据库方法。
  • @DeepakTripathi 好吧,如果您有另一个具有您感兴趣的 ID 的数据库表,那么您可以与问题中显示的表进行连接。
  • 我会试试这个方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-26
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 2016-11-30
  • 2010-11-22
  • 2015-11-07
相关资源
最近更新 更多