首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过添加新的主键字段来更新django中的模型?

如何通过添加新的主键字段来更新django中的模型?
EN

Stack Overflow用户
提问于 2014-12-01 03:31:40
回答 3查看 9.2K关注 0票数 2

如何用自定义主键字段替换Django模型中的默认主键?

首先,我有一个没有主键的模型,因为django默认会将一个id字段添加为主字段

代码语言:javascript
复制
#models.py
from django.db import models

class Event(models.Model):
    title = models.CharField(max_length=50, unique=True)
    description = models.CharField(max_length=150)

我从django shell中添加了一些对象。

代码语言:javascript
复制
>>e = Event('meeting', 'Contents about meeting')
>>e.save()
>>e = Event('party', 'Contents about party')
>>e.save()

然后,我需要添加自定义字符字段作为主要到这个模型。

代码语言:javascript
复制
class Event(models.Model):
    event-id = models.CharField(max_length=50, primary_key=True)
    ...

运行makemigrations

代码语言:javascript
复制
$ python manage.py makemigrations
You are trying to add a non-nullable field 'event-id' to event without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows)
 2) Quit, and let me add a default in models.py
Select an option: 1
Please enter the default value now, as valid Python
The datetime and `django.utils.timezone modules` are available, so you can do e.g. timezone.now()
>>> 'meetings'
Migrations for 'blog':
  0002_auto_20141201_0301.py:
    - Remove field id from event
    - Add field event-id to event

但是,在运行迁移时,它引发了一个错误:

代码语言:javascript
复制
.virtualenvs/env/local/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py", line 485, in execute
return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: UNIQUE constraint failed: blog_event__new.event-id
EN

回答 3

Stack Overflow用户

发布于 2015-05-25 01:07:32

在我的经验中(在这里使用Django 1.8.* ),在试图更新已经存在的模型的PK字段、与另一个模型有一个外键关系以及在后端表中有关联数据时,我看到了类似的情况。

您没有指定是否在FK关系中使用此模型,但似乎是这样的。

在这种情况下,您得到的错误消息是因为已经存在的数据需要与您请求的更改保持一致--即一个新的领域将是PK。这意味着必须删除当前的PK,django才能“替换”它们。(按照docs1,Django只支持每个模型的一个PK字段。)

提供与相关表中当前现有数据相匹配的默认值应该有效。

例如:

代码语言:javascript
复制
class Organization(models.Model):
    # assume former PK field no longer here; name is the new PK
    name = models.CharField(primary_key=True)

class Product(models.Model):
    name = models.CharField(primary_key=True)
    organization = models.ForeignKey(Organization)

如果您正在更新Organization模型,并且产品已经存在,那么必须更新现有的产品行,以引用有效的Organization PK值。在迁移过程中,您可能希望选择一个现有的Organization PKs (例如,负责现有产品的更新。

1

票数 1
EN

Stack Overflow用户

发布于 2014-12-01 05:43:32

Django已经在后端建立了一个自动递增整数id作为主键,当您创建之前的模型时。

当您试图运行新模型时,尝试重新创建一个失败的新主键列。

另一个原因是,当您创建字段时,Django期望为它找不到的每个新行显式定义一个唯一的值,这就是原因。

正如在前面的答案中所述,您可以重新创建迁移,然后尝试执行,again.It应该可以工作。干杯:-)

票数 0
EN

Stack Overflow用户

发布于 2014-12-01 03:39:14

问题是,您使字段惟一,然后尝试对表中的所有行使用相同的值。我不确定是否有一种以编程方式提供密钥的方法,但您可以执行以下操作:

  • 删除迁移
  • 从字段中删除primary_key属性
  • 重新迁移
  • 应用它
  • 填写所有行的值。
  • 将primary_key属性添加到字段中
  • 重新迁移
  • 应用它

这是野蛮的,但应该工作得很好。

祝你好运!

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27221295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档