【问题标题】:adding a column to a table django将列添加到表 django
【发布时间】:2016-09-12 01:43:50
【问题描述】:

我想在 django 中为模型添加一列。我使用的数据库是mysql。 较早的数据库文件是;

class Student(models.Model):
    name = models.CharField(max_length=20, validators=[validate_name])
    password = models.CharField(max_length=100)
    email = models.EmailField(max_length=50)


class StudentForm(forms.ModelForm):
    class Meta:
        model = Student
        fields = '__all__'

现在,我在密码之后也添加了以下行:

repeat_password = models.CharField(max_length=100)

现在我正在运行以下命令:

python manage.py makemigrations
python manage.py migrate

第一行结果为0001_initial.py,其内容为:

class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='Student',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=20, validators=[ajax.models.validate_name])),
                ('password', models.CharField(max_length=100)),
                ('repeat_password', models.CharField(max_length=100)),
                ('email', models.EmailField(max_length=50)),
            ],
        ),
    ]

但是,第二行并没有向数据库添加任何内容:

mysql> desc ajax_student;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int(11)      | NO   | PRI | NULL    | auto_increment |
| name     | varchar(20)  | NO   |     | NULL    |                |
| password | varchar(100) | NO   |     | NULL    |                |
| email    | varchar(10)  | NO   |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

我不知道我做错了什么? 我在 SO 上寻找答案,但没有一个有效:Altering database tables in Django

Adding fields to an already existing database

请帮我解决这个问题。

编辑

感谢大家的帮助。当我添加字段repeat_password 时,它要求一个默认值:

You are trying to add a non-nullable field 'repeat_password' to student 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()

所以,我做错的是选择了 1 个选项并删除了以前的迁移。然后运行makemigrationsmigrations,以避免重写默认值。这就是我收到错误消息的原因。

但是,当我选择第二个选项然后给出一个默认值时,我运行上面的命令,它起作用了。 问题是我只是想避免自己提供默认值。我不知道为什么在添加额外字段时需要它,但在创建字段时,它不是必需的。

【问题讨论】:

  • 嗯。尝试在生产服务器上运行 django shell 并在生产服务器中创建一些测试数据,其中包含您刚刚添加的额外文件(如果可以的话)。之后尝试从 Student 中检索所有对象。会不会有错误?
  • 哪个 django 版本?
  • 为什么要存储repeat_password?。这主要用于避免用户拼写错误,因此仅前端就足够了
  • @learner 如果 jQuery 被禁用,那么您可以在不保存数据库(在后端)的情况下进行验证。关于你的db问题,添加default参数:models.CharField(max_length=100, default='')
  • 作为@chachan,您不应向模型添加重复密码,但应将其添加到表单中。此外,您真的应该使用一种久经考验的 django 身份验证机制。您不想保存纯文本密码,因为您的模型似乎正在这样做

标签: python mysql django


【解决方案1】:

每当Django 似乎不允许我更改表时,我都会这样做。将model 重命名为Student_1。然后添加新字段:

class Student_1(models.Model):
    name = models.CharField(max_length=20, validators=[validate_name])
    password = models.CharField(max_length=100)
    email = models.EmailField(max_length=50)
    repeat_password = models.CharField(max_length=100)

运行python manage.py makemigrations,它将识别新表student_1。然后运行python manage.py migrate

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    相关资源
    最近更新 更多