【问题标题】:Django: Check if value exists in object.filter listDjango:检查object.filter列表中是否存在值
【发布时间】:2020-06-15 16:25:17
【问题描述】:

在我的 Django 项目中,我需要检查用户提交的值是否存在于通过 objects.filter() 从数据库返回的值列表中。

用户提交的数据:

value = request.data['value_id']

获取有效状态作为 id:

allowed_values = Values.objects.filter(Q(code='Active') | Q(code='Inactive')).values('id')

这将返回一个查询集,如下所示。

<QuerySet [{'id': 1}, {'id': 2}]>

检查用户提交的值是否存在于 allowed_values 中:

if value in allowed_values:
    return True

但这不起作用,我需要 allowed_values 作为“id”列表返回。在不遍历 allowed_values 和创建新列表的情况下如何做到这一点?

【问题讨论】:

  • 你的意思是用户通过API提交数据?然后有自动的方式做你想做的事。您使用的是哪些库?
  • 这能回答你的问题吗? django models: get list of id
  • 为什么不尝试仅提取与id 相关的数据,如果没有行返回则不允许

标签: python django python-3.x


【解决方案1】:

你可以使用 values_list() 方法代替 values() 方法

 allowed_values = Values.objects.filter(Q(code='Active') | Q(code='Inactive')).values_list('id',flat=True)

或者,如果你只需要检查,你可以使用过滤器:

if Values.objects.filter(Q(code='Active') | Q(code='Inactive')).filter(id=value).count() > 0:
    return True

【讨论】:

  • Values.objects.filter(Q(code='Active') | Q(code='Inactive'), id=value).exists()
【解决方案2】:

使用values_list('id', flat=True) 代替.values('id')

【讨论】:

    【解决方案3】:

    你可以使用exists(),就这么简单

    allowed_values = Values.objects.filter(...).exists()
    

    如果 QuerySet 包含任何结果,这将返回 True。

    【讨论】:

      【解决方案4】:

      根据您的代码,您可以按照以下逻辑编写解决方案...

      allowed_values = Values.objects.filter(Q(code='Active') | Q(code='Inactive')).values('id')
      allowed_values_list = list(allowed_values)
      
      for id_dict in allowed_values_list
          if value == id_dict['id']:
              return True
      

      【讨论】:

        猜你喜欢
        • 2011-11-20
        • 1970-01-01
        • 2022-11-12
        • 2018-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-06
        相关资源
        最近更新 更多