【问题标题】:Conditional Django Query条件 Django 查询
【发布时间】:2019-06-11 15:28:57
【问题描述】:

我正在使用此查询进行搜索。我想根据statusstart_dateend_date搜索列表

status 可以是 Active、Inactive 或 AllStatus。

start_date 可以是日期或无(可以为空)

end_date 可以是日期或无(可以为空)

status = form.cleaned_data['status']
start_date = form.cleaned_data['start_date']
end_date = form.cleaned_data['end_date']

我在下面进行了查询,但它给了我错误 - Cannot use None as a query value

谁能告诉我问题是什么以及我应该如何使用statusstart_dateend_date 查询,有时值为None

Jobs.objects.filter(
    Q(job_company=self.request.user.userprofile.user_company) |
    Q(job_created_on__range=[start_date, end_date]) |
    Q(job_created_on__gt=start_date) |
    Q(job_created_on__lt=end_date) |
    Q(job_status=status)
)

【问题讨论】:

    标签: django django-models django-forms django-templates django-views


    【解决方案1】:

    您可以动态构建查找:

    status = form.cleaned_data['status']
    start_date = form.cleaned_data['start_date']
    end_date = form.cleaned_data['end_date']
    company = self.request.user.userprofile.user_company
    
    lookups = (Q(job_company=company) |  Q(job_status=status) 
    
    if start_date:
        lookups = lookups | Q(job_created_on__gt=start_date)
    if end_date:
        lookups = lookups | Q(job_created_on__lt=end_date)
    
    Jobs.objects.filter(lookups)
    

    job_created_on__range 查找是不必要的。

    另外,检查你是否真的想要job_created_on__gt/__ltjob_created_on__gte/__lte

    【讨论】:

    • 先生,它给了我错误received a naive datetime (2019-01-12 00:00:00) while time zone support is active RuntimeWarning,甚至查询也不起作用
    • 这很可能是您的表单存在的问题,最好在单独的问题中回答。另外,不用叫我先生,我们都是朋友:)
    • 因为您的日期时间需要 tzinfo(时区信息)执行此操作。 from django.utils.timezone import make_awaremake_aware(start_date) make_aware(end_date) @HuzaifSayyed
    • @YugandharChaudhari start/end_date 实际上是 date 对象,请参阅此问题和答案:stackoverflow.com/questions/54237576/…
    猜你喜欢
    • 2018-12-04
    • 2019-01-16
    • 2019-04-21
    • 1970-01-01
    • 2012-05-01
    • 2016-11-09
    • 2019-04-12
    • 2013-10-13
    • 2020-12-26
    相关资源
    最近更新 更多