Фильтрация в Django не работает с полем float
Я пытаюсь получить несколько записей из базы данных MySQL, но похоже, что фильтрация по полю float не работает. Когда я фильтрую только по user_id
, я получаю все записи, но когда я добавляю предложение value
, я получаю исключение DoesNotExist.
У меня есть следующие модели и запрос:
class Record(models.Model):
user_id = models.IntegerField()
value = models.FloatField()
class User(models.Model):
value = models.FloatField()
Record.objects.get(
user_id=user.id,
value=user.value
)
user.value
переменная в коде python имеет вид 0.4
(float
). Столбец value
в базе данных имеет тип float unsigned
и его значение 0.4
.
Я предполагаю, что это что-то из-за природы типа float, но каков правильный способ фильтрации по значению float с помощью моделей Django?
Это связано с тем, как Python представляет значения с плавающей точкой (Django's FloatField переводит в Python's float, а Django's DecimalField переводит в Python's decimal; см. https://docs.python.org/2/library/decimal.html).
Отличие в том, что плавающие числа не являются точными из-за способа их представления на компьютере; десятичный тип стремится устранить некоторые из этих недостатков (https://docs.djangoproject.com/en/dev/ref/models/fields/#floatfield-vs-decimalfield).
Учитывая вашу ситуацию с попыткой получить поплавок через точное совпадение, у вас есть два варианта:
Измените тип значения в User и Record на DecimalField (значение = models)
DecimalField(количество цифр=5, количество мест=2, null=True)
Вы можете запросить диапазон значений, если хотите сохранить тип как FloatField.