条件Django查询

条件Django查询,django,django-models,django-forms,django-templates,django-views,Django,Django Models,Django Forms,Django Templates,Django Views,我正在使用此查询进行搜索。我想根据状态、开始日期和结束日期 状态可以是活动、非活动或全部状态 开始日期可以是日期,也可以是无日期(可以为空) 结束日期可以是日期,也可以是无日期(可以为空) 我在下面进行了此查询,但它给了我一个错误-不能将None用作查询值 有谁能告诉我问题出在哪里,我应该如何使用状态、开始日期和结束日期进行查询,有时值为无 Jobs.objects.filter( Q(job_company=self.request.user.userprofile.user_comp

我正在使用此查询进行搜索。我想根据
状态
开始日期
结束日期

状态
可以是活动、非活动或全部状态

开始日期
可以是日期,也可以是无日期(可以为空)

结束日期
可以是日期,也可以是无日期(可以为空)

我在下面进行了此查询,但它给了我一个错误-
不能将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)
)

您可以动态生成查找:

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\u created\u on\uu gt/\uu lt
job\u created\u on\uu gte/\uu lte

先生,这给了我一个错误
收到了一个原始的日期时间(2019-01-12 00:00:00)虽然时区支持是活动的RuntimeWarning
,甚至查询也不起作用,但这很可能是表单的问题,最好在单独的问题中回答。另外,不必叫我先生,我们在这里都是朋友:)因为您的datetime希望tzinfo(时区信息)这样做
从django.utils.timezone导入make_aware
make_aware(开始日期)
make_aware(结束日期)
@HuzaifSayyed@YugandharChaudhari
start/end\u date
实际上是
date
对象,请参见以下问题和答案:
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)