Django - Использование Cast для запроса, являются ли значения CharField gte, когда не все значения являются строковыми представлениями ints
У меня есть модель DataField в django, которую я использую для хранения значений для различных типов полей. Она выглядит следующим образом:
class DataField(models.Model):
class FieldTypes(models.TextChoices):
TEXT = 'Text', 'Text'
QUANTITATIVE = 'Quantitative', 'Quantitative'
SELECTION = 'Selection', 'Selection'
name = models.CharField(max_length=50)
field_type = models.CharField(max_length=150, choices=FieldTypes.choices)
value = models.CharField(max_length=150)
Я хочу иметь возможность сделать мультизапрос, возвращающий определенные типы DataField с определенными значениями, которые больше заданного числа, например:
DataField.objects.filter((Q("value__gte"= 1000) & Q(name= 'credit'))| (Q("value"= "Smith") & Q(name='Last Name')))
Проблема в том, что поле значений является CharField, поэтому я не могу делать gte-фильтры. Поле должно быть CharField, потому что я также храню другие значения строк слов, например, имена.
Я попытался использовать Cast для создания поля value_int для запроса, но поскольку не все значения для DataField.value могут быть преобразованы в int, я получаю синтаксическую ошибку:
queryset = DataField.objects.annotate(
value_int=Cast('value', output_field=IntegerField()),).all()
django.db.utils.DataError: invalid input syntax for type integer: "Smith"
Есть ли способ добавить некоторую логику в Cast, чтобы если значение не является действительным целым числом, оно просто переходило в null?
Для числового типа значения необходимо использовать соответствующее числовое поле для сравнения,
Не рекомендуется использовать числовое поле вместе с полем char и фильтровать его, поскольку предполагается, что поле является числовым
Поскольку, предположим, у вас '2' сохранено как символьное поле, но на самом деле оно числовое, то сравнение, предположим, '2' > '10' даст строковое сравнение, а не числовое
Поэтому рекомендуется сохранить имя в другом поле, а числовое значение в другом