迁移时出现django错误:“没有与引用表的给定键匹配的唯一约束

因此,我看到很多这类问题突然出现(很少回答),而在我所看到的Django方面却没有一个.我很困惑为什么我得到错误,我想我在字段装饰器上缺少了某些东西,或者在模型定义中没有了.这是两个模型…(一个缩写).我以为我在外键引用的一个表中将唯一键和主键设置为true,就可以正确地做所有事情,但是在迁移时会出现此错误:

django.db.utils.ProgrammingError:没有与引用表“ swsite_zoneentity”的给定键匹配的唯一约束

编辑过时的代码…

class ZoneEntity(models.Model):
    zone_number = models.CharField(max_length=100, primary_key=True)
    mpoly = models.PolygonField() #this should grow and shrink for the most representative one...
    objects = models.GeoManager() 
    created_at=models.DateField(auto_now_add=True)
    updated_at=models.DateField(auto_now=True)

class CesiumEntity(models.Model):
    be_number = models.CharField(max_length=100) #the number assigned to a foot print to distinguish
    #zone_id = models.CharField(max_length=100, null=True, blank=True)
    zone_id = models.ForeignKey('ZoneEntity', null=True, blank=True)

解决方法:

Codejoy,

定义主键时,它会自动设置为唯一键.因此,只需进行以下操作:

class ZoneEntity(models.Model):
    zone_number = models.CharField(max_length=100, primary_key=True)
    ....

class CesiumEntity(models.Model):
    ...
    zone_id = models.ForeignKey('ZoneEntity', null=True, blank=True)
    ...

这将自动将ZoneEntity的PK与zone_id绑定!

如果您尝试建立关系的字段不是主键,则可以添加unique = True和to_field =’foo’

 - python manage.py. makemigration
s
Migrations for 'module1':
  0002_auto_20170214_1503.py:
    - Create model CesiumEntity
    - Create model ZoneEntity
    - Add field zone_id to cesiumentity

 - python manage.py migrate
Operations to perform:
  Synchronize unmigrated apps: staticfiles, messages
  Apply all migrations: admin, contenttypes, module1, auth, sessions
Synchronizing apps without migrations:
  Creating tables...
    Running deferred SQL...
  Installing custom SQL...
Running migrations:
  Rendering model states... DONE
  Applying module1.0002_auto_20170214_1503... OK
上一篇:php-Postgis-st_distance


下一篇:python – 使用GeoDjango进行3d距离计算