当前位置: 首页 > 知识库问答 >
问题:

外键有问题。Django迁移

左丘弘致
2023-03-14

我必须定义code.Spatial类,如主键和codels.LScharacteristic codels.PlannedUsing,如外键。当我尝试migrate:ProgrammingError:ERROR:foreign key约束中指定的id列不存在时,我遇到了这个问题。

UPD完整日志:上述异常是以下异常的直接原因:

回溯(最后一次调用):文件“manage.py”,第23行,从命令行执行(sys.argv)文件“/home/user/MyProjects/forest venv/lib/python3.5/site packages/django/core/management/init.py”,第371行,从命令行执行实用程序.execute()文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/core/management/init.py”,第365行,在执行self.fetch_命令(子命令)中。从_-argv(self.argv)文件/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/core/management/base.py中运行_,第288行,从_-argv-self.execute(*args,**cmd_选项)文件运行”/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/core/management/base.py”,第335行,在执行输出=self.handle(*args,**选项)文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/core/management/commands/migrate.py”,第200行,在handle-fake\u initial=fake\u initial,File”中/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/migrations/executor.py”,第117行,在migrate state=self.\u migrate\u all\u-forwards(state,plan,full\u-plan,fake=fake,fake\u-initial=fake\u initial)文件/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/migrations/executor“,第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 state=migration“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/migrations/migration.py”,第122行,在应用操作中。数据库转发(self.app标签,模式编辑器,旧状态,项目状态)文件/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/migrations/operations/fields.py“,第216行,在数据库中转发schema_editor.alter_field(从_model,从_field,到_field)文件“/home/user/MyProjects/forest venv/lib/python3.5/site packages/django/db/backends/base/schema.py”,第525行,在alter_field旧_db_params,新_db_params,strict)文件中“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/backends/postgresql/schema.py”,第122行,在'u alter_字段new_-db_-params,strict,File/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/backends/base/schema.py','第750行,在'u alter_字段self.execute(self.'u.'create_-fk_-fk_-fk_-sql(model,new文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/backends/base/schema.py”,第133行,在execute cursor.execute(sql,params)文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/backends/utils.py”,第100行,在execute return super().execute(sql,params)文件中/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/backends/utils.py“,第68行,执行返回self.\u使用包装器执行(sql,params,many=False,executor=self.\u-execute)文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/backends/utils.py”,第77行,使用包装器执行返回执行器(sql,params,many,context)文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/backends/utils.py”,第85行,在执行返回self.cursor.execute(sql,params)文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/utils.py”,第89行,在退出时使用回溯(traceback)提高dj_执行值从exc_值文件“/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/backends/utils.py”,第85行,执行返回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列,为什么id列存在?我怎样才能修好它?

共有2个答案

狄玉书
2023-03-14

你可以用

def __str__(self):
        return self.etat

def __int__(self):

具体来说,你在django模型上返回什么。像这样:

tests= models.CharField(max_length=100, verbose_name="Test")
class Meta:
        verbose_name = "Tests"
        ordering = ['tests']

    def __str__(self):
        return self.tests
扈高逸
2023-03-14

我认为问题在于您的ForeignKey字段没有明确指向您标记为primary的字段(Spatial.code)。通过将Spatial.code标记为primary,可以阻止Django创建id字段。请参阅文档,但如果将ForeignKey指向一个模型,它将尝试链接到该模型的id字段。要解决此问题,您可以将参数添加到\u field='code'并将unique=True添加到Spatial.code。请参阅文档

 类似资料:
  • 我正在为Django管理员设置: model.py 在admin.py 对此,我得到了以下错误: (admin. E202)“磁盘。文件”没有“磁盘。设置”的外键 根据https://docs . django project . com/en/dev/ref/models/fields/# django . db . models . foreign key中的文档,它应该可以工作。 我做了一些

  • 我想知道是否有可能在laravel迁移中添加字符串引用的外键。所以,我在第一次文件迁移时有这些代码。 在第二个迁移文件中,我有以下代码: 运行迁移时,会显示一个错误: SQLSTATE[HY000]:一般错误:1215无法添加外键约束(SQL:alter table`account`add constraint account\ U roles\ U level\ U外键(`acc\ U role

  • 问题内容: 我在oracle的1个表中有一个复合主键。我想为第二个表中的一个表项创建一个外键,该表项引用第一个表中的复合主键。我收到错误ORA-02256。关于如何输入此内容有任何想法吗? 问题答案: 该错误是因为FOREIGN KEY是一列,但是您尝试提供两列作为父列。不需要绑定到复合键,因为它没有列… 您也有倒退的关系-使用: 我将为要来自的任何表添加一个外键约束。

  • 我在mysql工作台上设计了一个数据库。当我转到forward engineer时,我得到了(错误号:121),因为我在多个表中使用了相同的外键,我意识到这是不允许的。我有相当多的连接表,主要是n:m关系。对于这些连接表中的大多数,我都使用复合主键(由2个外键组成)。我的问题是我必须重命名这些主键和外键是唯一的吗?谢谢你的帮助。 (在下面的代码中,我还没有重命名外键)

  • Laravel5.6运行于:PHP7.2,MariaDB 10.3 当我想为我的表设置外键时,我只是不断地犯这个错误。 在其他表中,由Laravel本身定义的所有id变量和无符号自动增量 所以,我的迁移是这样的: 错误如下所示: SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;检查与您的MariaDB服务器版本对应的手册,以了解在LINE 1(SQL:alter

  • 问题内容: 一般来说,我对Web应用程序和数据库内容还是陌生的,所以这可能是一个愚蠢的问题。我想制作一个模型(“ CategoryModel”),其字段指向模型的另一个实例(其父实例)的主要ID。 我该怎么做呢?谢谢! 问题答案: 您可以将模型的名称作为字符串传递给ForeignKey,它将做正确的事情。 所以: 或者您可以使用字符串“ self”