Результаты запроса Django postgres, получающие разные результаты для разных полей базы данных - PullRequest
0 голосов
/ 09 марта 2019

У меня есть две простые таблицы в PostgreSQL.

Таблица 1 (которая сохраняет число в Varchar):

class Numbers_char_model(models.Model):

    number = models.CharField(max_length=256, blank=True, null=True)

Таблица 2 (которая сохраняет число в целом числе):

class Numbers_int_model(models.Model):

    number = models.IntegerField(blank=True, null=True)

Данные в обеих таблицах одинаковы.

id   number

1   ->  0

2   ->  20

3   ->  40

4   ->  70

5   ->  110

6   ->  150

Когда я нажимаю на запросы ниже, они оба дают разные результаты.

def number_query(request):

    ax_int = Numbers_int_model.objects.filter(number__lte='20')
    ax_char = Numbers_char_model.objects.filter(number__lte='20')

ax_int output -> 0,20

ax_char output -> 0,20,110,150

Может кто-нибудь это очистить?

Ответы [ 3 ]

1 голос
/ 09 марта 2019

Это потому, что сравнение int и сравнение строк не совпадают. Сравнение строк работает по типу char на char. Здесь для вашего случая первый символ четырех строк это '0', '2', '1', '1'. и 2 больше, чем все они. Так что это тип вывода.

Для этого случая сначала нам нужно привести числовое поле к int, а затем сделать это. Это возможно с extra ссылкой

 Numbers_char_model.objects.extra({'number':  "CAST(number as INT)"}).filter_by(number__lte=20)

Ссылка: ссылка

0 голосов
/ 09 марта 2019

Вы можете привести строку к int без extra (что устарело).Следующее должно дать вам ожидаемые результаты (хотя, очевидно, разумнее использовать IntegerField для начала):

from django.db.models import IntegerField
from django.db.models.functions import Cast

ax_char = (
    Numbers_char_model.objects
    .annotate(number_int=Cast('number', IntegerField()))
    .filter(number_int__lte=20)
)
0 голосов
/ 09 марта 2019

Numbers_char_model имеет CharField. Вы не можете сделать меньше или равно строке. Numbers_int_model работает, потому что строка '20' преобразуется в int с помощью ORM Django.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...