Фильтрация в 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.

Вернуться на верх