2013-10-08 3 views
0

I. Предположим, у вас есть следующие модели:Создание схемы для CharField vs BooleanField имеет другой выход, почему?

class Knight(models.Model): 
    name = models.CharField(max_length=100) 
    of_the_round_table = models.BooleanField() 

II. Теперь вы добавите эту модель schemamigration Южной и миграции:

python manage.py schemamigration myapp --initial 
python manage.py migrate myapp 

III. Вы можете создать запись в таблице Knight:

>>> jason = Knight.objects.get(name=”Jason”) 

Ничего из обычных здесь, только регулярной рутиной. Однако обратите внимание на следующее.

IV-A. Добавить новое поле модели (CharField):

class Knight(models.Model): 
    name = models.CharField(max_length=100) 
    of_the_round_table = models.BooleanField() 
    surname = models.CharField(max_length=100) # + 

V-A. Написать schemamigration для этого нового поля:

$ python manage.py schemamigration myapp --auto 
? The field 'Knight.surname' does not have a default specified, yet is NOT NULL. 
? Since you are adding this field, you MUST specify a default 
? value to use for existing rows. Would you like to: 
? 1. Quit now, and add a default to the field in models.py 
? 2. Specify a one-off value to use for existing columns now 

НО

Теперь давайте попробуем шаг IV и V снова, но с BooleanField вместо CharField

IV-B. Добавить новое поле модели (BooleanField):

class Knight(models.Model): 
    name = models.CharField(max_length=100) 
    of_the_round_table = models.BooleanField() 
    has_sword = models.BooleanField() # + 

V-B. Написать schemamigration для этого нового поля:

$ python manage.py schemamigration myapp --auto 
+ Added field has_sword on registration.Knight 
Created 0005_auto__add_field_knight_has_sword.py. You can now apply this migration with: ./manage.py migrate registration 

Q1: Почему я получаю другой выход для добавления BooleanField (V-B), чем для добавления CharField (V-A), даже если according to the Django docs оба эти поля имеют null=False по по умолчанию?

Q2: Как вы должны знать, какие поля будут давать результаты, подобные BooleanField и какие из них даст выход как CharField при применении python manage.py schemamigration myapp --auto к модели, в данном обстоятельстве?

Я использую SQlite как РСУБД и Django 1.4 кстати.

ответ

3

Это потому, что в Django до версии 1.5 BooleanField использует False как неявное значение по умолчанию. То есть going to change in Django 1.6.

Так что, пока ваш CharField не имеет значения по умолчанию, заставляя Юг запрашивать его, BooleanField имеет значение по умолчанию, даже если оно неявно.

+0

Aha ok, поэтому в случае, когда я дал какое-либо другое поле, но 'BooleanField' будет генерировать тот же результат, что и CharField (для Django 1.4). – Bentley4

+1

Да, я так считаю. –

Смежные вопросы