【问题标题】:Django: filtering queryset by 'field__isnull=True' or 'field=None'?Django:通过'field__isnull = True'或'field = None'过滤查询集?
【发布时间】:2013-04-27 15:16:10
【问题描述】:

我必须通过动态值(可以是无)过滤查询集:我可以简单地写吗:

filtered_queryset = queryset.filter(field=value)

或者我应该检查无:

if value is None:
    filtered_queryset = queryset.filter(field__isnull=True)
else:
    filtered_queryset = queryset.filter(field=value)

行为是否取决于特定的 DBMS?

【问题讨论】:

    标签: django django-models django-queryset isnull


    【解决方案1】:

    ORM 将为您处理 None(将其转换为 NULL)并返回一个 QuerySet 对象,因此除非您需要捕获 None 输入,否则第一个示例很好。

    >>> User.objects.filter(username=None)
    []
    >>> type(_)
    <class 'django.db.models.query.QuerySet'>
    >>> str(User.objects.filter(username=None).query)
    SELECT "auth_user"."id", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_user"."password", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."is_superuser", "auth_user"."last_login", "auth_user"."date_joined" FROM "auth_user" WHERE "auth_user"."username" IS NULL
    

    【讨论】:

    • +1 我不知道它像这样处理None,非常有用。
    • 我使用的是 Django 1.7,两种情况都生成相同的查询:在 [19] 中:str(User.objects.filter(username__isnull=True).query) == str(User.objects. filter(username=None).query) Out[19]: True 所以,我想你可以使用任何一个。
    【解决方案2】:

    我更喜欢处理更好的第二种解决方案

    Update

    if value is None:
        filtered_queryset = queryset.filter(field__isnull=True)
        # Do some proessing with  filtered_queryset object with None values
    else:
        filtered_queryset = queryset.filter(field=value)
        # Do some proessing with  filtered_queryset object with not NULL values
    

    查询集可以处理 Null 值。基于此 User.objects.filter(username=None) 这将只获取 username=NULL 的值

    【讨论】:

    • 建议您的第二个条件的唯一原因是,如果您想处理 None 条件并对其进行一些处理,那么您可以使用第二种解决方案。请参阅更新后的答案..
    • 谢谢。最后一个问题:当你说“这只会获取 username=NULL 的值”时,你的意思是 Django 会翻译成“用户名为 NULL”,以防数据库后端需要它?
    • 例如1)queryset = MyModel.objects.all() 2)print queryset.query 3)SELECT "app_mymodel"."id", ... FROM "app_mymodel"
    猜你喜欢
    • 2020-08-22
    • 2019-04-15
    • 2011-09-29
    • 2014-01-08
    • 2019-03-16
    • 2018-10-02
    相关资源
    最近更新 更多