Код: Выделить всё
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"
}
}
Код: Выделить всё
InputsSchema(major_version=NumericalFilterSchema(gt=None, lt=None, gte=None, lte=None, exact=None), app_name=StringFilterSchema(contains=None, icontains='google', exact=None))
Есть ли способ избежать создания несуществующих ключей в созданной модели? Итак, после проверки запроса у меня будет что-то вроде:
Код: Выделить всё
InputsSchema(major_version=NumericalFilterSchema(exact=None), app_name=StringFilterSchema(icontains='google'))
Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/792 ... -with-none
Мобильная версия