外键问题。 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