关于django unique 的问题

代码如下,

class Batch(models.Model):
    """批信息"""
    batch = models.CharField(max_length=20,verbose_name=u"批信息")
    remark = models.CharField(max_length=40, verbose_name=u"备注",null=True,blank=True)

现在我想给batch 加一个unique=True

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, packagingWorkshop, qc, sessions, users
Running migrations:
  Applying packagingWorkshop.0013_auto_20200416_1138...Traceback (most recent call last):
  File "D:\python_demo\manhour\venv\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "D:\python_demo\manhour\venv\lib\site-packages\django\db\backends\mysql\base.py", line 71, in execute
    return self.cursor.execute(query, args)
  File "D:\python_demo\manhour\venv\lib\site-packages\MySQLdb\cursors.py", line 209, in execute
    res = self._query(query)
  File "D:\python_demo\manhour\venv\lib\site-packages\MySQLdb\cursors.py", line 315, in _query
    db.query(q)
  File "D:\python_demo\manhour\venv\lib\site-packages\MySQLdb\connections.py", line 239, in query
    _mysql.connection.query(self, query)
MySQLdb._exceptions.OperationalError: (1068, 'Multiple primary key defined')

会报错,说是有多个主键,因为之前没定义主键,所以系统自动生成一个id给我。

尝试过,直接加unique=True ,以及primary_key=True
但是在migrate(makemiragtions没问题)都会有类似的报错

Traceback (most recent call last):
  File "manage.py", line 21, in <module>
    main()
  File "manage.py", line 17, in main
    execute_from_command_line(sys.argv)
  File "D:\python_demo\manhour\venv\lib\site-packages\django\core\management\__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "D:\python_demo\manhour\venv\lib\site-packages\django\core\management\__init__.py", line 375, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "D:\python_demo\manhour\venv\lib\site-packages\django\core\management\base.py", line 323, in run_from_argv
    self.execute(*args, **cmd_options)
  File "D:\python_demo\manhour\venv\lib\site-packages\django\core\management\base.py", line 364, in execute
    output = self.handle(*args, **options)
  File "D:\python_demo\manhour\venv\lib\site-packages\django\core\management\base.py", line 83, in wrapped
    res = handle_func(*args, **kwargs)
  File "D:\python_demo\manhour\venv\lib\site-packages\django\core\management\commands\migrate.py", line 234, in handle
    fake_initial=fake_initial,
  File "D:\python_demo\manhour\venv\lib\site-packages\django\db\migrations\executor.py", line 117, in migrate
    state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial)
  File "D:\python_demo\manhour\venv\lib\site-packages\django\db\migrations\executor.py", line 147, in _migrate_all_forwards
    state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
  File "D:\python_demo\manhour\venv\lib\site-packages\django\db\migrations\executor.py", line 245, in apply_migration
    state = migration.apply(state, schema_editor)
  File "D:\python_demo\manhour\venv\lib\site-packages\django\db\migrations\migration.py", line 124, in apply
    operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
  File "D:\python_demo\manhour\venv\lib\site-packages\django\db\migrations\operations\fields.py", line 249, in database_forwards
    schema_editor.alter_field(from_model, from_field, to_field)
  File "D:\python_demo\manhour\venv\lib\site-packages\django\db\backends\base\schema.py", line 535, in alter_field
    old_db_params, new_db_params, strict)
  File "D:\python_demo\manhour\venv\lib\site-packages\django\db\backends\base\schema.py", line 715, in _alter_field
    self.execute(self._create_unique_sql(model, [new_field.column]))
  File "D:\python_demo\manhour\venv\lib\site-packages\django\db\backends\base\schema.py", line 137, in execute
    cursor.execute(sql, params)
  File "D:\python_demo\manhour\venv\lib\site-packages\django\db\backends\utils.py", line 99, in execute
    return super().execute(sql, params)
  File "D:\python_demo\manhour\venv\lib\site-packages\django\db\backends\utils.py", line 67, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "D:\python_demo\manhour\venv\lib\site-packages\django\db\backends\utils.py", line 76, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "D:\python_demo\manhour\venv\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "D:\python_demo\manhour\venv\lib\site-packages\django\db\utils.py", line 89, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "D:\python_demo\manhour\venv\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "D:\python_demo\manhour\venv\lib\site-packages\django\db\backends\mysql\base.py", line 71, in execute
    return self.cursor.execute(query, args)
  File "D:\python_demo\manhour\venv\lib\site-packages\MySQLdb\cursors.py", line 209, in execute
    res = self._query(query)
  File "D:\python_demo\manhour\venv\lib\site-packages\MySQLdb\cursors.py", line 315, in _query
    db.query(q)
  File "D:\python_demo\manhour\venv\lib\site-packages\MySQLdb\connections.py", line 239, in query
    _mysql.connection.query(self, query)
django.db.utils.OperationalError: (1061, "Duplicate key name 'packagingWorkshop_batch_batch_58b8975d_uniq'")

我的问题是,这种情况下,要如何给batch字段变成主键且唯一,要如何操作呢。
除了重新删表建库。。

阅读 1.8k
1 个回答

找到逐渐的字段名,先

alter table 表名  drop primary key;

再往batch中添加主键

alter table 表名 add constraint pk_batch primary key(batch);
思路大概是这样子,先删掉主键约束,再添加batch的主键约束,django不太懂,应该model里面有对应的方法或者你直接到存储该表的数据库在命令行操作。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题