当字段为None时,布尔字段和字符串字段的DB比较成功时,要传递什么默认值(mongoengine)

问题描述 投票:1回答:1

我的查询是这样的。

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,而有一些没有。

例子 :

前提条件中的employment_status

B计划 : val(preconditions.employment_status ) = True

就业状况不在先决条件之内

计划A : val(preconditions.employment_status ) = None

用户信息。

用户A : val(employment_status)= True

用户B: val(employment_status)= False

所以我想 userAuserB 的查询结果中 PlanA (此举失败)

userA 的查询结果中 planB(此法)

python mongodb orm mongoengine odm
1个回答
1
投票

这是MongoEngine的一个不幸的方面。通常默认值不会被显式写入DB(或者如果你在一些记录存在后添加了默认值)。我看到有几个选项。

  1. 明确地将虚假记录设置为False并保存。然后查询应该可以工作。这需要对DB中已有的记录进行查询。

  2. 查询为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()
© www.soinside.com 2019 - 2024. All rights reserved.