В моделях django для mysql мы теряем информацию при использовании IntegerField для int (1) - PullRequest
1 голос
/ 29 февраля 2012

У нас есть таблица БД mysql, которая имеет такие атрибуты, как:

+-----------------------+------------------+------+-----+-------------------+
| Field                 | Type             | Null | Key | Default           |
+-----------------------+------------------+------+-----+-------------------+
| age                   | int(1)           | YES  |     | NULL              |
| blah                  | int(1)           | YES  |     | NULL              |

Мне было любопытно узнать о int (1), и я обратился к документации, а вот описание:

M indicates the maximum display width for integer types. 
The maximum legal display width is 255. Display width is 
unrelated to the range of values a type can contain
[ . . . ]

Учитывая, что я хочу сохранить текущую схему, есть ли способ в Django, где мы можем указать длину отображения models.*IntegerField?

Приложение / models.py:

from django.db import models

class Grade(models.Model):
    type = models.SmallIntegerField(primary_key=True)
    name = models.CharField(max_length=30)

    def __unicode__(self):
        return self.name

Вот сгенерированный SQL:

>  python manage.py sql app

BEGIN;
CREATE TABLE `app_grade` (
    `type` smallint NOT NULL PRIMARY KEY,
    `name` varchar(30) NOT NULL
)
;
COMMIT;

Редактировать : Я узнал о команде manage.py inspectdb, которая будет генерировать модель на основе существующих таблиц БД. Для рассматриваемой таблицы вывод для столбца типа int(1):

class table(models.Model):
    [ . . . ]
    columnx = models.IntegerField(null=True, db_column='columnX', blank=True) # Field name made lowercase.
    [ . . . ]

Итак, Джанго считает int(M) и IntegerField одинаковыми. Я в порядке с этим, пока никакая информация / ограничение не потеряны. Какие здесь рекомендации?

1 Ответ

1 голос
/ 01 марта 2012

Как сказано в документации MySQL, INT - это INT. Ширина отображения не влияет на диапазон значений, которые могут быть сохранены в столбце, или накладывает какие-либо другие ограничения на значения, поэтому вам не нужно это учитывать. Ширина отображения для целочисленных типов действительно влияет только на display (и только для ограниченного набора вещей, которые действительно его уважают).

Теперь SQL, сгенерированный Django, когда вы использовали SmallIntegerField, использовал SMALLINT. SMALLINT имеет ли другой (меньший) диапазон возможных значений, чем INT.

Здесь важно сохранить тип данных, поэтому используйте IntegerField.

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