Пользовательское преобразование Django с оператором case для приведения строки к int или nullPython

Программы на Python
Anonymous
Пользовательское преобразование Django с оператором case для приведения строки к int или null

Сообщение Anonymous »

Я пытаюсь создать собственный поиск django as_int, чтобы вы могли легко сравнивать и упорядочивать содержимое текстовых полей, когда они содержат только числа, и обрабатывать их как NULL, когда они имеют неправильный формат.
Например:

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

Comment.objects.filter(body__as_int__gt=5)
# Should treat a comment with body="37" as 37
# Should treat a comment with body="abc" as NULL
Вот что у меня есть на данный момент:

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

class AsIntTransform(Transform):
lookup_name = "as_int"
output_field = models.IntegerField()

def as_sql(self, compiler, connection):
case_expr = Case(
When(
Regex(self.lhs, r"^\d+$"),
then=Cast(self.lhs, models.IntegerField()),
),
default=Value(None),
)
return case_expr.as_sql(compiler, connection)

models.CharField.register_lookup(AsIntTransform)
models.TextField.register_lookup(AsIntTransform)
Попытка фильтрации с помощью приведенного выше кода приводит к ошибке:

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

    field_list = name.split(LOOKUP_SEP)
^^^^^^^^^^
AttributeError: 'Col' object has no attribute 'split'
Похоже, что «Col», о котором здесь идет речь, — это self.lhs в преобразовании, но я не уверен, что мне нужно изменить, чтобы это сделать работаешь?

Подробнее здесь: https://stackoverflow.com/questions/787 ... ther-int-o

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