Какое значение по умолчанию должно быть передано для логического и строкового поля для успешного сравнения БД, когда поля None (mongoengine) - PullRequest
1 голос
/ 08 мая 2020

Мой запрос выглядит следующим образом:

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) 

теперь есть планы, у которых есть статус_работанности в предварительных условиях, а в некоторых нет.

Пример:

Статус_работности в предварительных условиях

план B: val(preconditions.employment_status ) = True

статус_ занятости не в предварительных условиях

план A: val(preconditions.employment_status ) = None

информация о пользователе:

userA: val(employment_status)= True

userB: val(employment_status)= False

, поэтому я хочу userA и userB в результате запроса для PlanA (это не удается)

userA в результате запроса для planB (это работает)

1 Ответ

1 голос
/ 08 мая 2020

Это неудачный аспект MongoEngine. Часто значения по умолчанию не записываются явно в БД (или если вы добавили значение по умолчанию после того, как там есть некоторые записи). Я вижу несколько вариантов:

  1. Явно установите для ложных записей значение False и сохраните их. Тогда запрос должен работать. Это необходимо сделать для записей, уже находящихся в БД.

  2. Запрос False или None. Вы можете использовать функцию or вот так. Этот ответ охватывает это, я думаю: MongoDB с использованием предложения OR в mongoengine

Например, я бы подумал, что это выглядит так:

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()
...