外键问题。 Django 迁移
Problem with ForeignKey. Django migrations
我必须像 primary_key 一样定义 code.Spatial class 和像外键一样的 codels.LScharacteristic codels.PlannedUsing 。
当我尝试迁移时,我遇到了这个问题:ProgrammingError: ERROR: 外键约束中指定的 id 列不存在。
UPD full log:上述异常是以下异常的直接原因:
回溯(最后一次调用):
文件 "manage.py",第 23 行,位于
execute_from_command_line(sys.argv)
文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/core/management/init.py”,第 371 行,在 execute_from_command_line 中
utility.execute()
文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/core/management/init.py”,第 365 行,在执行中
self.fetch_command(子命令)。run_from_argv(self.argv)
文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/core/management/base.py”,第 288 行,在 run_from_argv 中
self.execute(*args, **cmd_options)
文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/core/management/base.py”,第 335 行,在执行中
输出 = self.handle(*args, **options)
文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/core/management/commands/migrate.py”,第 200 行,在句柄中
fake_initial=fake_initial,
文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/migrations/executor.py”,第 117 行,迁移
state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial)
文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/migrations/executor.py”,第 147 行,在 _migrate_all_forwards 中
state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/migrations/executor.py”,第 244 行,在 apply_migration 中
状态 = migration.apply(状态, schema_editor)
文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/migrations/migration.py”,第 122 行,在应用中
operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/migrations/operations/fields.py”,第 216 行,在 database_forwards 中
schema_editor.alter_field(from_model, from_field, to_field)
文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/backends/base/schema.py”,第 525 行,在 alter_field 中
old_db_params, new_db_params, 严格)
文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/backends/postgresql/schema.py”,第 122 行,在 _alter_field
new_db_params, 严格,
文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/backends/base/schema.py”,第 750 行,在 _alter_field
self.execute(self._create_fk_sql(型号, new_field, "fk%(to_table)s_%(to_column)s “))
文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/backends/base/schema.py”,第 133 行,在执行中
cursor.execute(sql, 参数)
文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/backends/utils.py”,第 100 行,在执行中
return super().execute(sql, 参数)
文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/backends/utils.py”,第 68 行,在执行中
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/backends/utils.py”,第 77 行,在 _execute_with_wrappers 中
return 执行者(sql,参数,许多,上下文)
文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/backends/utils.py”,第 85 行,在 _execute 中
return self.cursor.execute(sql, 参数)
文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/utils.py”,第 89 行,在 exit
从 exc_value 提高 dj_exc_value.with_traceback(traceback)
文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/backends/utils.py”,第 85 行,在 _execute 中
return self.cursor.execute(sql, 参数)
但我的模型中没有 id 列:
from django.db import models
from django.utils.translation import ugettext_lazy as _
from renter.models import RefAbstract, Renter
from django.contrib.gis.db import models
from textwrap import shorten
class Unitt(RefAbstract):
....//some classes
class Task(RefAbstract):
class Meta(RefAbstract.Meta):
verbose_name = 'task'
verbose_name_plural = 'tasks'
class Spatial(models.Model):
codeq = models.IntegerField('no',help_text='no')
code = models.PositiveIntegerField('cutare',primary_key=True,help_text='cutare')//unique column
codeV = models.IntegerField('novi',help_text='novi')
renter = models.ForeignKey(Renter, on_delete=models.DO_NOTHING, verbose_name='renter')
geometry = models.MultiPolygonField(geography=True, verbose_name='geometry')
class Meta:
verbose_name = 'cutarea'
verbose_name_plural = 'cutarea'
class LScharacteristic(models.Model):
codels = models.ForeignKey(Spatial, on_delete=models.DO_NOTHING, verbose_name = 'cutarea')// Foreign Key
tract = models.CharField('tract',max_length = 80, help_text='tract')
task = models.ForeignKey(Task, on_delete=models.DO_NOTHING, verbose_name='task')
totalarea = models.PositiveIntegerField('totarea',help_text = 'totarea')
explarea = models.PositiveIntegerField('exarea',help_text = 'exarea')
protecttype = models.CharField('category',max_length = 50, help_text = 'category')
class Meta:
verbose_name = 'characteristic'
verbose_name_plural = 'characteristics'
class PlannedUsing(models.Model):
codels = models.ForeignKey(Spatial, on_delete=models.DO_NOTHING, verbose_name = 'cutarea') // Foreign Key
codeq = models.IntegerField(help_text='number')
cutareaShape = models.ForeignKey(CutareaShape, on_delete=models.DO_NOTHING, verbose_name='form')
cuttype = models.ForeignKey(CutareaType, on_delete=models.DO_NOTHING, verbose_name='type1')
managetype = models.ForeignKey(ManageType, on_delete=models.DO_NOTHING, verbose_name='type2')
unit = models.ForeignKey(Unitt, on_delete=models.DO_NOTHING, verbose_name='unit')
composition = models.ForeignKey(Composition, on_delete=models.DO_NOTHING, verbose_name='sort')
assortment = models.ForeignKey(Assortment, on_delete=models.DO_NOTHING, verbose_name='assort)
class Meta:
verbose_name = 'planus'
verbose_name_plural = 'planuss'
什么是 id 列?如果我不定义它们,为什么会存在 id 列?
我该如何解决?
您可以使用
def __str__(self):
return self.etat
或
def __int__(self):
具体来说,你 return 在你的 django 模型上做了什么。
像这样:
tests= models.CharField(max_length=100, verbose_name="Test")
class Meta:
verbose_name = "Tests"
ordering = ['tests']
def __str__(self):
return self.tests
我认为问题在于您的 ForeignKey 字段没有明确指向您标记为主要字段 (Spatial.code
) 的字段。
通过将 Spatial.code
标记为主要的,您可以防止 Django 创建 id 字段。请参阅 the documentation 但是如果您将 ForeignKey 指向一个模型,它将尝试 link 指向该模型的 id 字段。
要解决此问题,您可以将参数添加到 ForeignKey 字段:to_field='code'
并将 unique=True
添加到 Spatial.code
.See documentation
我必须像 primary_key 一样定义 code.Spatial class 和像外键一样的 codels.LScharacteristic codels.PlannedUsing 。 当我尝试迁移时,我遇到了这个问题:ProgrammingError: ERROR: 外键约束中指定的 id 列不存在。
UPD full log:上述异常是以下异常的直接原因:
回溯(最后一次调用): 文件 "manage.py",第 23 行,位于 execute_from_command_line(sys.argv) 文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/core/management/init.py”,第 371 行,在 execute_from_command_line 中 utility.execute() 文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/core/management/init.py”,第 365 行,在执行中 self.fetch_command(子命令)。run_from_argv(self.argv) 文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/core/management/base.py”,第 288 行,在 run_from_argv 中 self.execute(*args, **cmd_options) 文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/core/management/base.py”,第 335 行,在执行中 输出 = self.handle(*args, **options) 文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/core/management/commands/migrate.py”,第 200 行,在句柄中 fake_initial=fake_initial, 文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/migrations/executor.py”,第 117 行,迁移 state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial) 文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/migrations/executor.py”,第 147 行,在 _migrate_all_forwards 中 state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial) 文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/migrations/executor.py”,第 244 行,在 apply_migration 中 状态 = migration.apply(状态, schema_editor) 文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/migrations/migration.py”,第 122 行,在应用中 operation.database_forwards(self.app_label, schema_editor, old_state, project_state) 文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/migrations/operations/fields.py”,第 216 行,在 database_forwards 中 schema_editor.alter_field(from_model, from_field, to_field) 文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/backends/base/schema.py”,第 525 行,在 alter_field 中 old_db_params, new_db_params, 严格) 文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/backends/postgresql/schema.py”,第 122 行,在 _alter_field new_db_params, 严格, 文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/backends/base/schema.py”,第 750 行,在 _alter_field self.execute(self._create_fk_sql(型号, new_field, "fk%(to_table)s_%(to_column)s “)) 文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/backends/base/schema.py”,第 133 行,在执行中 cursor.execute(sql, 参数) 文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/backends/utils.py”,第 100 行,在执行中 return super().execute(sql, 参数) 文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/backends/utils.py”,第 68 行,在执行中 return self._execute_with_wrappers(sql, params, many=False, executor=self._execute) 文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/backends/utils.py”,第 77 行,在 _execute_with_wrappers 中 return 执行者(sql,参数,许多,上下文) 文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/backends/utils.py”,第 85 行,在 _execute 中 return self.cursor.execute(sql, 参数) 文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/utils.py”,第 89 行,在 exit 从 exc_value 提高 dj_exc_value.with_traceback(traceback) 文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/backends/utils.py”,第 85 行,在 _execute 中 return self.cursor.execute(sql, 参数)
但我的模型中没有 id 列:
from django.db import models
from django.utils.translation import ugettext_lazy as _
from renter.models import RefAbstract, Renter
from django.contrib.gis.db import models
from textwrap import shorten
class Unitt(RefAbstract):
....//some classes
class Task(RefAbstract):
class Meta(RefAbstract.Meta):
verbose_name = 'task'
verbose_name_plural = 'tasks'
class Spatial(models.Model):
codeq = models.IntegerField('no',help_text='no')
code = models.PositiveIntegerField('cutare',primary_key=True,help_text='cutare')//unique column
codeV = models.IntegerField('novi',help_text='novi')
renter = models.ForeignKey(Renter, on_delete=models.DO_NOTHING, verbose_name='renter')
geometry = models.MultiPolygonField(geography=True, verbose_name='geometry')
class Meta:
verbose_name = 'cutarea'
verbose_name_plural = 'cutarea'
class LScharacteristic(models.Model):
codels = models.ForeignKey(Spatial, on_delete=models.DO_NOTHING, verbose_name = 'cutarea')// Foreign Key
tract = models.CharField('tract',max_length = 80, help_text='tract')
task = models.ForeignKey(Task, on_delete=models.DO_NOTHING, verbose_name='task')
totalarea = models.PositiveIntegerField('totarea',help_text = 'totarea')
explarea = models.PositiveIntegerField('exarea',help_text = 'exarea')
protecttype = models.CharField('category',max_length = 50, help_text = 'category')
class Meta:
verbose_name = 'characteristic'
verbose_name_plural = 'characteristics'
class PlannedUsing(models.Model):
codels = models.ForeignKey(Spatial, on_delete=models.DO_NOTHING, verbose_name = 'cutarea') // Foreign Key
codeq = models.IntegerField(help_text='number')
cutareaShape = models.ForeignKey(CutareaShape, on_delete=models.DO_NOTHING, verbose_name='form')
cuttype = models.ForeignKey(CutareaType, on_delete=models.DO_NOTHING, verbose_name='type1')
managetype = models.ForeignKey(ManageType, on_delete=models.DO_NOTHING, verbose_name='type2')
unit = models.ForeignKey(Unitt, on_delete=models.DO_NOTHING, verbose_name='unit')
composition = models.ForeignKey(Composition, on_delete=models.DO_NOTHING, verbose_name='sort')
assortment = models.ForeignKey(Assortment, on_delete=models.DO_NOTHING, verbose_name='assort)
class Meta:
verbose_name = 'planus'
verbose_name_plural = 'planuss'
什么是 id 列?如果我不定义它们,为什么会存在 id 列? 我该如何解决?
您可以使用
def __str__(self):
return self.etat
或
def __int__(self):
具体来说,你 return 在你的 django 模型上做了什么。 像这样:
tests= models.CharField(max_length=100, verbose_name="Test")
class Meta:
verbose_name = "Tests"
ordering = ['tests']
def __str__(self):
return self.tests
我认为问题在于您的 ForeignKey 字段没有明确指向您标记为主要字段 (Spatial.code
) 的字段。
通过将 Spatial.code
标记为主要的,您可以防止 Django 创建 id 字段。请参阅 the documentation 但是如果您将 ForeignKey 指向一个模型,它将尝试 link 指向该模型的 id 字段。
要解决此问题,您可以将参数添加到 ForeignKey 字段:to_field='code'
并将 unique=True
添加到 Spatial.code
.See documentation