2016-10-01 74 views
2

我尝试使用PostgreSQL数据库(之前,我有SQLite的),但我有一个消息当我执行python manage.py migrateDjango的:ProgrammingError:列“ID”不存在

Operations to perform: 
Apply all migrations: sessions, admin, sites, auth, contenttypes, main_app 
Running migrations: 
Rendering model states... DONE 
Applying main_app.0004_auto_20161002_0034...Traceback (most recent call last): 
File "manage.py", line 10, in <module> 
execute_from_command_line(sys.argv) 
File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 353, in execute_from_command_line 
utility.execute() 
File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 345, in execute 
self.fetch_command(subcommand).run_from_argv(self.argv) 
File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 348, in run_from_argv 
self.execute(*args, **cmd_options) 
File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 399, in execute 
output = self.handle(*args, **options) 
File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/migrate.py", line 200, in handle 
executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial) 
File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/executor.py", line 92, in migrate 
self._migrate_all_forwards(plan, full_plan, fake=fake, fake_initial=fake_initial) 
File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/executor.py", line 121, in _migrate_all_forwards 
state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial) 
File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/executor.py", line 198, in apply_migration 
state = migration.apply(state, schema_editor) 
File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/migration.py", line 123, in apply 
operation.database_forwards(self.app_label, schema_editor, old_state, project_state) 
File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/operations/fields.py", line 201, in database_forwards 
schema_editor.alter_field(from_model, from_field, to_field) 
File "/usr/local/lib/python2.7/dist-packages/django/db/backends/base/schema.py", line 482, in alter_field 
old_db_params, new_db_params, strict) 
File "/usr/local/lib/python2.7/dist-packages/django/db/backends/postgresql/schema.py", line 110, in _alter_field 
new_db_params, strict, 
File "/usr/local/lib/python2.7/dist-packages/django/db/backends/base/schema.py", line 634, in _alter_field 
params, 
File "/usr/local/lib/python2.7/dist-packages/django/db/backends/base/schema.py", line 110, in execute 
cursor.execute(sql, params) 
File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 79, in execute 
return super(CursorDebugWrapper, self).execute(sql, params) 
File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute 
return self.cursor.execute(sql, params) 
File "/usr/local/lib/python2.7/dist-packages/django/db/utils.py", line 95, in __exit__ 
six.reraise(dj_exc_type, dj_exc_value, traceback) 
File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute 
return self.cursor.execute(sql, params) 
django.db.utils.ProgrammingError: column "id" does not exist 
LINE 1: ..._app_projet" ALTER COLUMN "id" TYPE integer USING "id"::inte... 

所以我想这个误差约为我的模型'Projet',但是这个模型有ID字段!我看到,在0001_initial.py

... 
migrations.CreateModel(
     name='Projet', 
     fields=[ 
      ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 
      ('name', models.CharField(db_index=True, max_length=30)), 
      ('presentation', models.TextField(max_length=2500, null=True)), 
... 

我的迁移main_app.0004_auto_20161002_0034:

class Migration(migrations.Migration): 

    dependencies = [ 
     ('main_app', '0003_auto_20161002_0033'), 
    ] 

    operations = [ 
     migrations.AlterField(
      model_name='projet', 
      name='id', 
      field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), 
    ), 
    ] 

谟模式是这样的:

class Group(models.Model) : 
    name = models.CharField(max_length=30, db_index=True) 

    class Meta : 
     abstract = True 
     unique_together = (("id", "name"),) 


class Projet(Group) : 
    presentation = models.TextField(max_length=2500, null=True) 

真的,我不明白为什么我有这个错误...我的设置配置数据库是好的,所有其他模型的工作,...

如果我忘记了什么,请不要犹豫告诉我!我需要你的帮助!

+0

为什么你'unique_together =((ID”, “姓名”))'主键ID是由已独特本身,所以把它包含在'unique_together'中是没有意义的,回溯显示'0004_auto_20161002_0034'导致错误,所以你应该在你的问题中包含这个迁移。 – Alasdair

+0

是的确是这样,我删除了unique_together。包括0004_auto .. – Preumsse

+0

你有没有机会让'Group''抽象“在迁移时,当它不是”抽象“的时候?非抽象模型的子模型不会有'id'列... – AKX

回答

2

您的模型定义没有将任何字段标识为主键,因此Django假定名为id的主键列。但是这个列在表中并不存在。

更改您的模型定义,将其中一个字段指定为主键,Django不会尝试查找id列。

+0

但是在Django中,如果我不创建一个字段作为主键,Django就会这样做!证明:在0001_initial.py中,主键是自动创建的... – Preumsse

+0

是的。如果Django不存在,Django隐式创建一个自动增量整数主键列,所以这不是问题。 – AKX

+0

@AKX Django假设存在一个“id”列,但我不相信它会创建它。 –

2
class Group(models.Model) : 
    name = models.CharField(max_length=30, unique=True) 

    class Meta: 
     abstract = True 


class Projet(Group) : 
    presentation = models.CharField(max_length=2500, blank=True) 

删除您的迁移并创建一个新迁移。

只需加我两分钱。

可空字段:

Avoid using null on string-based fields such as CharField and TextField because empty string values will always be stored as empty strings, not as NULL. If a string-based field has null=True, that means it has two possible values for “no data”: NULL, and the empty string. In most cases, it’s redundant to have two possible values for “no data;” the Django convention is to use the empty string, not NULL.

See https://docs.djangoproject.com/en/1.10/ref/models/fields/#null

MAX_LENGTH:

If you specify a max_length attribute, it will be reflected in the Textarea widget of the auto-generated form field. However it is not enforced at the model or database level. Use a CharField for that.

https://docs.djangoproject.com/en/1.10/ref/models/fields/#textfield

+0

我从我的模型中删除'default = True'并将其替换为默认值=“”,但我遇到同样的问题 – Preumsse

相关问题