我的查询是这样的。
employee = Partner_employees.objects()\
.filter(id=user_id) \
.filter(earnings__gte=preconditions.earnings.gte) \
.filter(earnings__lte=preconditions.earnings.lte) \
.filter(work_rating__gte=preconditions.credit_score) \
.filter(employment_status=preconditions.employment_status)
现在有一些计划在前提条件中包含了employment_status,而有一些没有。
例子 :
B计划 : val(preconditions.employment_status ) = True
计划A : val(preconditions.employment_status ) = None
用户A : val(employment_status)= True
用户B: val(employment_status)= False
所以我想 userA
和 userB
的查询结果中 PlanA
(此举失败)
userA
的查询结果中 planB
(此法)
这是MongoEngine的一个不幸的方面。通常默认值不会被显式写入DB(或者如果你在一些记录存在后添加了默认值)。我看到有几个选项。
明确地将虚假记录设置为False并保存。然后查询应该可以工作。这需要对DB中已有的记录进行查询。
查询为False或None。你可以使用 or
这样的特点。这个答案我想已经涵盖了。MongoDB在mongoengine中使用OR子句。
对于你的例子,我认为是这样的。
employee = Partner_employees.objects()\
.filter(id=user_id) \
.filter(earnings__gte=preconditions.earnings.gte) \
.filter(earnings__lte=preconditions.earnings.lte) \
.filter(work_rating__gte=preconditions.credit_score) \
.filter(Q(employment_status=False or Q(employment_status=None))
我不确定默认值是哪种方式 但你可以一直这样做。我假设默认值是False。
query = ... # same as above but not test for employment_status
if preconditions.employment_stats:
query = query.filter(employment_status=True)
else:
query = query.filter(Q(employment_status=False or Q(employment_status=None))
return query.first()