从models.py迁移我的数据时出现问题

Posted

技术标签:

【中文标题】从models.py迁移我的数据时出现问题【英文标题】:Issue while migrating my data from models.py 【发布时间】:2018-04-03 01:08:22 【问题描述】:

伙计们,我收到一个错误,因为您应该为模型设置默认值:作者、正文、已创建、已更新 这是我的 models.py 配置

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
# Create your models here.
class post(models.Model):
    STATUS_CHOICE=(
        ('draft','DRAFT'),
        ('published','Published'),
    )

    title=models.CharField(max_length=250)
    slug=models.SlugField(max_length = 250,unique_for_date=1)
    author=models.ForeignKey(User,related_name='blog_posts')
    body=models.TextField()
    publish=models.DateTimeField(default=timezone.now)
    created = models.DateTimeField(auto_now_add=True)
    updated=models.DateTimeField(auto_now=True)
    status = models.CharField(max_length=10,
                            choices = STATUS_CHOICE,
                                default='draft')
    class Meta:
        ordering = ('-publish',)
    def __str__(self):
        return self.title

这是迁移数据库时的错误:

You are trying to add a non-nullable field 'body' to post 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 with a null value for this column)
 2) Quit, and let me add a default in models.py
Select an option

我不确定这些模型的默认值是什么,并且配置与书中提到的相同,但我仍然遇到错误 任何形式的帮助表示赞赏 提前致谢 注意:这是一个博客应用程序 当我尝试向模型添加随机默认值时,我收到了这个错误: 更新了models.py:

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
# Create your models here.
class post(models.Model):
    STATUS_CHOICE=(
        ('draft','DRAFT'),
        ('published','Published'),
        ('admin','admin'),
    )

    title=models.CharField(max_length=250)
    slug=models.SlugField(max_length = 250)
    author=models.ForeignKey(User,related_name='blog_posts')
    body=models.TextField(default='draft')
    publish=models.DateTimeField(default=timezone.now)
    created = models.DateTimeField(auto_now_add=True,default=timezone.now)
    updated =models.DateTimeField(auto_now=True,default=timezone.now)
    status = models.CharField(max_length=10,
                            choices = STATUS_CHOICE,
                                default='draft')
    class Meta:
        ordering = ('-publish',)
    def __str__(self):
        return self.title

现在的错误是:

ERRORS:
myblog.post.created: (fields.E160) The options auto_now, auto_now_add, and default are mutually exclusive. Only one of these options may
 be present.
myblog.post.updated: (fields.E160) The options auto_now, auto_now_add, and default are mutually exclusive. Only one of these options may
 be present

【问题讨论】:

错误看起来很清楚,你不需要DateTimeField中的两个选项 感谢您的回复是的,我已经删除了 DateTimeField 的值并添加了默认值,但它仍然要求我提供 slug 和作者,请您弄清楚默认值应该是什么 【参考方案1】:

为什么不使用 null=True, blank=True - 允许模型属性为空!

我会将body属性的默认设置为''

body=models.TextField(default='')

时间戳不应该有默认值,你提供的callables应该足够了。

# Model Timestamp
created     = models.DateTimeField(auto_now_add=True)
updated     = models.DateTimeField(auto_now=True)

在进行迁移时遇到创建和更新属性的缺失默认错误,选择 1) 并在控制台中输入 timezone.now()。这会将现有行的默认值设置为当前日期时间。

【讨论】:

感谢您在编辑所有内容后查看我的问题,正如您所说,我仍然收到此错误:您正在尝试使用“auto_now_add=True”添加“已创建”字段以发布没有默认;数据库需要一些东西来填充现有的行。 1) 现在提供一次性默认值(将在所有现有行上设置) 2) 退出,让我在 models.py 中添加默认值 选择一个选项:myblog\models.py14:71 我改了答案,现在应该可以通过了。 感谢它的工作,我刚刚为所有这些添加了 null = true,如果您想帮助和解决像我这样的初学者的问题,请加入这个 slack 团队:join.slack.com/t/python-django-adroits/shared_invite/…

以上是关于从models.py迁移我的数据时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

“需要领域迁移”,从领域数据库中检索值时出现异常

在非连续版本之间迁移时出现核心数据迁移错误

调用 MySQL 存储过程时出现数据包乱序错误

从 v3 迁移到 v4 react-router 时出现错误

用大写字母命名 django 应用程序可以吗?

添加迁移EF Core时出现奇怪错误