Pydantic/Django Ninja использует только существующие ключи (даже если нет)Python

Программы на Python
Ответить
Anonymous
 Pydantic/Django Ninja использует только существующие ключи (даже если нет)

Сообщение Anonymous »

наличие приложения в Django Ninja со схемами:

Код: Выделить всё

class NumericalFilterSchema(Schema):
gt: Optional[int] = None
lt: Optional[int] = None
gte: Optional[int] = None
lte: Optional[int] = None
exact: Optional[int] = None

class Config(Schema.Config):
extra = "forbid"

class StringFilterSchema(Schema):
contains: Optional[str] = None
icontains: Optional[str] = None
exact: Optional[str] = None

class Config(Schema.Config):
extra = "forbid"

class InputsSchema(Schema):
major_version: Optional[NumericalFilterSchema] = None
app_name: Optional[StringFilterSchema] = None

class Config(Schema.Config):
extra = "forbid"

class InputSchema(Schema):
filters: InputsSchema

class Config(Schema.Config):
extra = "forbid"

который я затем использую в конечной точке следующим образом:

Код: Выделить всё

@router_v1.post(
"/apps",
tags=["..."],
auth=AuthBearer(),
)
def dynamic_filter(request: HttpRequest, filters: InputsSchema):

query = Q()

# import ipdb

# ipdb.set_trace()

for key, value in filters.dict(exclude_none=True).items():
# key = translate_field(key) # just abstraction between endpoint keys to db keys
if isinstance(value, dict):
for k, v in value.items():
if v is not None:
query &= Q(**{f"{key}__{k}": v})
else:
query &= Q(**{key: value})

results = Apps.objects.filter(query)
...
Проблема:
Как вы можете видеть при построении запроса, я исключаю все значения None, что подходит в большинстве случаев, например:< /p>

Код: Выделить всё

{
"major_version": {
"exact": 3
},
"app_name": {
"icontains": "google"
}
}
это вернет схему

Код: Выделить всё

InputsSchema(major_version=NumericalFilterSchema(gt=None, lt=None, gte=None, lte=None, exact=3), app_name=StringFilterSchema(contains=None, icontains='google', exact=None))
и это здорово... но что, если мое входное значение — Нет?
например:

Код: Выделить всё

{
"major_version": {
"exact": null
},
"app_name": {
"icontains": "google"
}
}
здесь точная пара значений ключей будет преобразована в «точную»: None, которая будет такой же, как и другие ключи после проверки pydantic/ninja:

Код: Выделить всё

InputsSchema(major_version=NumericalFilterSchema(gt=None, lt=None, gte=None, lte=None, exact=None), app_name=StringFilterSchema(contains=None, icontains='google', exact=None))
что для меня "отстой", потому что я использую ignore_none=True, который отфильтровывает все значения None - даже то значение, которое я дал.
Есть ли способ избежать создания несуществующих ключей в созданной модели? Итак, после проверки запроса у меня будет что-то вроде:

Код: Выделить всё

InputsSchema(major_version=NumericalFilterSchema(exact=None), app_name=StringFilterSchema(icontains='google'))
значит, мне не нужно использовать ignore_none=True и передавать None в запрос?
Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/792 ... -with-none
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»