South尝试迁移时引发ValueError

时间:2013-03-02 00:06:50

标签: python mysql django django-south

我会直截了当地说:南方正在提出这个例外:

Microsoft Windows [versão 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. Todos os direitos reservados.

C:\Users\Bassut\PycharmProjects\Logos>manage.py migrate api
Running migrations for api:
 - Migrating forwards to 0001_initial.
 > api:0001_initial
FailedDryRun:  ! Error found during dry run of '0001_initial'! Aborting.
Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\south-0.7.5-py2.7.egg\south\migration\migr
ators.py", line 175, in _run_migration
    migration_function()
  File "C:\Python27\lib\site-packages\south-0.7.5-py2.7.egg\south\migration\migr
ators.py", line 57, in <lambda>
    return (lambda: direction(orm))
  File "C:\Users\Bassut\PycharmProjects\Logos\migrations\0001_initial.py", line
44, in forwards
    ('course', self.gf('django.db.models.fields.related.ForeignKey')(default=Fal
se, to=orm['api.Course'])),
  File "C:\Python27\lib\site-packages\south-0.7.5-py2.7.egg\south\db\generic.py"
, line 44, in _cache_clear
    return func(self, table, *args, **opts)
  File "C:\Python27\lib\site-packages\south-0.7.5-py2.7.egg\south\db\generic.py"
, line 343, in create_table
    for field_name, field in fields
  File "C:\Python27\lib\site-packages\south-0.7.5-py2.7.egg\south\db\generic.py"
, line 684, in column_sql
    default = field.get_db_prep_save(default, connection=self._get_connection())

  File "C:\Python27\lib\site-packages\django\db\models\fields\related.py", line
1047, in get_db_prep_save
    connection=connection)
  File "C:\Python27\lib\site-packages\django\db\models\fields\__init__.py", line
 304, in get_db_prep_save
    prepared=False)
  File "C:\Python27\lib\site-packages\django\db\models\fields\__init__.py", line
 549, in get_db_prep_value
    value = connection.ops.validate_autopk_value(value)
  File "C:\Python27\lib\site-packages\django\db\backends\mysql\base.py", line 28
8, in validate_autopk_value
    raise ValueError('The database backend does not accept 0 as a '
ValueError: The database backend does not accept 0 as a value for AutoField.

C:\Users\Bassut\PycharmProjects\Logos>

models.py:

# -*- coding: utf-8 -*-
from django.db import models
from django.contrib.auth.models import User
import datetime

class College(models.Model):
    acronym = models.CharField(max_length=10)
    full_name = models.CharField(max_length=100)

    class Meta():
        db_table = "College"

    def __unicode__(self):
        return self.full_name

class Course(models.Model):
    title = models.CharField(max_length=50)

    class Meta():
        db_table = "Course"

    def __unicode__(self):
        return self.title

class BasicUser(models.Model):
    user = models.ForeignKey(User)
    birthday = models.DateField()

    class Meta():
        db_table = 'BasicUser'

    def __unicode__(self):
        return (self.user.first_name + ' ' + self.user.last_name)

class Administrator(BasicUser):
    def __unicode__(self):
        return self.user.first_name
    class Meta():
        db_table = "Administrator"

class Student(BasicUser):
    college = models.ForeignKey(College, default=False)
    course = models.ForeignKey(Course, default=False)

    def __unicode__(self):
        return self.user.first_name

    class Meta():
        db_table = "Student"

class Subject(models.Model):
    title = models.CharField(max_length=50)

    class Meta():
        db_table = "Subject"

    def __unicode__(self):
        return self.title

class Division(models.Model):
    title = models.CharField(max_length=50)
    subject = models.ForeignKey(Subject)

    class Meta():
        db_table = "Division"

    def __unicode__(self):
        return self.title

class Topic(models.Model):
    division = models.ForeignKey(Division)
    title = models.CharField(max_length=50)

    class Meta():
        db_table = "Topic"

    def __unicode__(self):
        return self.title
    def get_subject(self):
        return self.division.subject

class Material(models.Model):
    topic = models.ForeignKey(Topic)

    added_by = models.ForeignKey(Administrator, verbose_name=u'Who added this material', default=False)
    title = models.CharField(max_length=50)
    text = models.TextField(max_length=5000)

    class Meta():
        db_table = "Material"

    def __unicode__(self):
        return self.title

    def set_subject(self, value):
        self.topic.division.subject = value

    def set_division(self, value):
        self.topic.division = value

class QuestionOption(models.Model):
    description = models.CharField(max_length=5000, verbose_name=u'The question option itself')

    def __unicode__(self):
        return self.description

    class Meta():
        db_table = 'question_option'

class Question(models.Model):
    topic = models.ForeignKey(Topic, verbose_name=u'What that question is about')
    added_by = models.ForeignKey(Administrator, verbose_name=u'Who added this question', default=False)
    difficulty = models.FloatField(default=0)
    type = models.CharField(max_length=30, verbose_name=u'Tipo da questão', default='multichoices')
    college = models.ForeignKey(College, verbose_name=u'From what college is the question')
    year = models.SmallIntegerField(default=datetime.date.today().year)
    text = models.TextField(max_length=30000)
    options = models.ManyToManyField(QuestionOption, related_name='question_alternatives', db_table=u'question_alternatives',
        verbose_name=u'Question alternatives')
    right_one = models.ForeignKey(QuestionOption, verbose_name=u'Right option for this question', default=False)

    class Meta():
        db_table='question'

    def __unicode__(self):
        return self.title

    def mount_question(self):
        return '(' + self.college.acronym + '-' + str(self.year) + ') ' + self.text

此外,0001_initial.py(控制台说了些什么):

# -*- coding: utf-8 -*-
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models


class Migration(SchemaMigration):

    def forwards(self, orm):
        # Adding model 'College'
        db.create_table('College', (
            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
            ('acronym', self.gf('django.db.models.fields.CharField')(max_length=10)),
            ('full_name', self.gf('django.db.models.fields.CharField')(max_length=100)),
        ))
        db.send_create_signal(u'api', ['College'])

        # Adding model 'Course'
        db.create_table('Course', (
            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
            ('title', self.gf('django.db.models.fields.CharField')(max_length=50)),
        ))
        db.send_create_signal(u'api', ['Course'])

        # Adding model 'BasicUser'
        db.create_table('BasicUser', (
            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
            ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])),
            ('birthday', self.gf('django.db.models.fields.DateField')()),
        ))
        db.send_create_signal(u'api', ['BasicUser'])

        # Adding model 'Administrator'
        db.create_table('Administrator', (
            (u'basicuser_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['api.BasicUser'], unique=True, primary_key=True)),
        ))
        db.send_create_signal(u'api', ['Administrator'])

        # Adding model 'Student'
        db.create_table('Student', (
            (u'basicuser_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['api.BasicUser'], unique=True, primary_key=True)),
            ('college', self.gf('django.db.models.fields.related.ForeignKey')(default=False, to=orm['api.College'])),
            ('course', self.gf('django.db.models.fields.related.ForeignKey')(default=False, to=orm['api.Course'])),
        ))
        db.send_create_signal(u'api', ['Student'])

        # Adding model 'Subject'
        db.create_table('Subject', (
            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
            ('title', self.gf('django.db.models.fields.CharField')(max_length=50)),
        ))
        db.send_create_signal(u'api', ['Subject'])

        # Adding model 'Division'
        db.create_table('Division', (
            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
            ('title', self.gf('django.db.models.fields.CharField')(max_length=50)),
            ('subject', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['api.Subject'])),
        ))
        db.send_create_signal(u'api', ['Division'])

        # Adding model 'Topic'
        db.create_table('Topic', (
            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
            ('division', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['api.Division'])),
            ('title', self.gf('django.db.models.fields.CharField')(max_length=50)),
        ))
        db.send_create_signal(u'api', ['Topic'])

        # Adding model 'Material'
        db.create_table('Material', (
            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
            ('topic', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['api.Topic'])),
            ('added_by', self.gf('django.db.models.fields.related.ForeignKey')(default=False, to=orm['api.Administrator'])),
            ('title', self.gf('django.db.models.fields.CharField')(max_length=50)),
            ('text', self.gf('django.db.models.fields.TextField')(max_length=5000)),
        ))
        db.send_create_signal(u'api', ['Material'])

        # Adding model 'QuestionOption'
        db.create_table('question_option', (
            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
            ('description', self.gf('django.db.models.fields.CharField')(max_length=5000)),
        ))
        db.send_create_signal(u'api', ['QuestionOption'])

        # Adding model 'Question'
        db.create_table('question', (
            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
            ('topic', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['api.Topic'])),
            ('added_by', self.gf('django.db.models.fields.related.ForeignKey')(default=False, to=orm['api.Administrator'])),
            ('difficulty', self.gf('django.db.models.fields.FloatField')(default=0)),
            ('type', self.gf('django.db.models.fields.CharField')(default='multichoices', max_length=30)),
            ('college', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['api.College'])),
            ('year', self.gf('django.db.models.fields.SmallIntegerField')(default=2013)),
            ('text', self.gf('django.db.models.fields.TextField')(max_length=30000)),
            ('right_one', self.gf('django.db.models.fields.related.ForeignKey')(default=False, to=orm['api.QuestionOption'])),
        ))
        db.send_create_signal(u'api', ['Question'])

        # Adding M2M table for field options on 'Question'
        db.create_table(u'question_alternatives', (
            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
            ('question', models.ForeignKey(orm[u'api.question'], null=False)),
            ('questionoption', models.ForeignKey(orm[u'api.questionoption'], null=False))
        ))
        db.create_unique(u'question_alternatives', ['question_id', 'questionoption_id'])


    def backwards(self, orm):
        # Deleting model 'College'
        db.delete_table('College')

        # Deleting model 'Course'
        db.delete_table('Course')

        # Deleting model 'BasicUser'
        db.delete_table('BasicUser')

        # Deleting model 'Administrator'
        db.delete_table('Administrator')

        # Deleting model 'Student'
        db.delete_table('Student')

        # Deleting model 'Subject'
        db.delete_table('Subject')

        # Deleting model 'Division'
        db.delete_table('Division')

        # Deleting model 'Topic'
        db.delete_table('Topic')

        # Deleting model 'Material'
        db.delete_table('Material')

        # Deleting model 'QuestionOption'
        db.delete_table('question_option')

        # Deleting model 'Question'
        db.delete_table('question')

        # Removing M2M table for field options on 'Question'
        db.delete_table('question_alternatives')


    models = {
        u'api.administrator': {
            'Meta': {'object_name': 'Administrator', 'db_table': "'Administrator'", '_ormbases': [u'api.BasicUser']},
            u'basicuser_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['api.BasicUser']", 'unique': 'True', 'primary_key': 'True'})
        },
        u'api.basicuser': {
            'Meta': {'object_name': 'BasicUser', 'db_table': "'BasicUser'"},
            'birthday': ('django.db.models.fields.DateField', [], {}),
            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"})
        },
        u'api.college': {
            'Meta': {'object_name': 'College', 'db_table': "'College'"},
            'acronym': ('django.db.models.fields.CharField', [], {'max_length': '10'}),
            'full_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
        },
        u'api.course': {
            'Meta': {'object_name': 'Course', 'db_table': "'Course'"},
            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
            'title': ('django.db.models.fields.CharField', [], {'max_length': '50'})
        },
        u'api.division': {
            'Meta': {'object_name': 'Division', 'db_table': "'Division'"},
            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
            'subject': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['api.Subject']"}),
            'title': ('django.db.models.fields.CharField', [], {'max_length': '50'})
        },
        u'api.material': {
            'Meta': {'object_name': 'Material', 'db_table': "'Material'"},
            'added_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'False', 'to': u"orm['api.Administrator']"}),
            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
            'text': ('django.db.models.fields.TextField', [], {'max_length': '5000'}),
            'title': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
            'topic': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['api.Topic']"})
        },
        u'api.question': {
            'Meta': {'object_name': 'Question', 'db_table': "'question'"},
            'added_by': ('django.db.models.fields.related.ForeignKey', [], {'default': 'False', 'to': u"orm['api.Administrator']"}),
            'college': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['api.College']"}),
            'difficulty': ('django.db.models.fields.FloatField', [], {'default': '0'}),
            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
            'options': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'question_alternatives'", 'symmetrical': 'False', 'db_table': "u'question_alternatives'", 'to': u"orm['api.QuestionOption']"}),
            'right_one': ('django.db.models.fields.related.ForeignKey', [], {'default': 'False', 'to': u"orm['api.QuestionOption']"}),
            'text': ('django.db.models.fields.TextField', [], {'max_length': '30000'}),
            'topic': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['api.Topic']"}),
            'type': ('django.db.models.fields.CharField', [], {'default': "'multichoices'", 'max_length': '30'}),
            'year': ('django.db.models.fields.SmallIntegerField', [], {'default': '2013'})
        },
        u'api.questionoption': {
            'Meta': {'object_name': 'QuestionOption', 'db_table': "'question_option'"},
            'description': ('django.db.models.fields.CharField', [], {'max_length': '5000'}),
            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
        },
        u'api.student': {
            'Meta': {'object_name': 'Student', 'db_table': "'Student'", '_ormbases': [u'api.BasicUser']},
            u'basicuser_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['api.BasicUser']", 'unique': 'True', 'primary_key': 'True'}),
            'college': ('django.db.models.fields.related.ForeignKey', [], {'default': 'False', 'to': u"orm['api.College']"}),
            'course': ('django.db.models.fields.related.ForeignKey', [], {'default': 'False', 'to': u"orm['api.Course']"})
        },
        u'api.subject': {
            'Meta': {'object_name': 'Subject', 'db_table': "'Subject'"},
            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
            'title': ('django.db.models.fields.CharField', [], {'max_length': '50'})
        },
        u'api.topic': {
            'Meta': {'object_name': 'Topic', 'db_table': "'Topic'"},
            'division': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['api.Division']"}),
            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
            'title': ('django.db.models.fields.CharField', [], {'max_length': '50'})
        },
        u'auth.group': {
            'Meta': {'object_name': 'Group'},
            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
        },
        u'auth.permission': {
            'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
        },
        u'auth.user': {
            'Meta': {'object_name': 'User'},
            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
        'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
        'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
        'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
        'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
        'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
    },
    u'contenttypes.contenttype': {
        'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
        'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
        u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
        'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
        'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
    }
}

complete_apps = ['api']

请告诉我发生了什么,以便我能解决。

提前致谢!

1 个答案:

答案 0 :(得分:3)

问题在于,您为ForeignKey定义的Student设置了default=FalseFalseForeignKey的无效值。只需删除它们就可以了。