【问题标题】:ValueError while migrating a model in DJango在 DJango 中迁移模型时出现 ValueError
【发布时间】:2021-06-09 16:32:01
【问题描述】:

我正在尝试在 Django 中创建一个简单的模型。预期的字段是一些文本和所有者的用户 ID。但是,当我执行 manage.py migrate 时会发生这种情况(makemigrations 工作没有错误)。我将不胜感激任何线索!

Running migrations:
  Applying manage_remittance.0001_initial... OK
  Applying manage_remittance.0002_remittance_owner...Traceback (most recent call last):
...
ValueError: invalid literal for int() with base 10: 'default'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
...
ValueError: Field 'id' expected a number but got 'default'.

models.py

from django.db import models
from django.contrib.auth.models import User

class Remittance(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    remittance_text = models.CharField(max_length=140)

    def __str__(self):
        return self.remittance_text

admin.py

from django.contrib import admin
from .models import Remittance

admin.site.register(Remittance)

0002_remittance_owner.py(我不知道为什么会出现这种情况,因为我迁移回版本零,然后使用 models.py 进行了 makemigrations,如上所示):

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

    dependencies = [
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
        ('manage_remittance', '0001_initial'),
    ]

    operations = [
        migrations.AddField(
            model_name='remittance',
            name='owner',
            field=models.ForeignKey(default='default', on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
        ),
    ]

【问题讨论】:

  • 请分享0002_remittance_owner 迁移文件。看起来你在那里设置了一个没有意义的默认值。
  • ` from django.conf import settings from django.db import migrations, models import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL) , ('manage_remittance', '0001_initial'), ] 操作 = [ migrations.AddField(model_name='remittance', name='owner', field=models.ForeignKey(default='default', on_delete=django.db.models .deletion.CASCADE, to=settings.AUTH_USER_MODEL), ), ] `
  • edit提问。
  • 您是否在运行 makemigrations 时提供了任何默认值?
  • 不,我没有。我刚刚跑了manage.py makemigrations,然后跑了manage.py migrations。此时数据库应该是空的。

标签: python django migration


【解决方案1】:

问题来了:

field=models.ForeignKey(default='default', on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)

owner 字段是 ForeignKey,类型为 int(),基于用户表中的 id。

您设置了 default='default' 并引发了 ValueError

在 Python 中,如果您尝试转换任何未格式化为整数的字符串值,则会引发此错误。

此错误消息告诉我们,以 10 为底的整数存在无效文字。这意味着我们通过 int() 方法传递的值无法转换。 'default' 不能转换为 ForeignKey 的 int 值。 删除它或给它一个整数类型的正确值

【讨论】:

  • 谢谢!这个建议奏效了。不过,我直接编辑了迁移文件 0002_remittance_owner.py。这是处理问题的正确方法吗?
  • 是 .. 如果您有 ForeignKey 的默认值,请在模型类中设置默认值,如下所示:owner = models.ForeignKey(User, on_delete=models.CASCADE, default=1) 并且您可以设置 null=True 如果所有者字段有时没有用户相关 @987654324 @
  • 再次感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2018-05-22
  • 2020-08-24
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
相关资源
最近更新 更多