ValueError:字段"id"需要一个数字,但得到"Die erste Meldung"。通过控制台添加项目后



我正试图通过命令行将一个项目添加到db.sqlite3中

In [10]: m = Meldung('Die erste Meldung', zeitstempel=datetime.today(), text='Nun kommt das klassische Hallo-Welt-Beispiel.')
In [11]: m.save()

但是得到了这个错误:

ValueError: Field 'id' expected a number but got 'Die erste Meldung'.

在migrations\0001_initial.py中,位于contentobject的字段id下方的Meldung被声明为auto_created=True,但它似乎没有按预期工作。

我该如何解决?

  • 预期结果
    字段"id"由db.sqlite3 自动生成

  • 环境
    Python 3.8.2
    Django 3.1.3

  • 型号.py

from django.db import models


class Meldung(models.Model):
titel = models.CharField(max_length=100)
zeitstempel = models.DateTimeField()
text = models.TextField('Meldungstext')

class Kommentar(models.Model):
meldung = models.ForeignKey(
Meldung,
on_delete=models.CASCADE,
)
autor = models.CharField(max_length=70)
text = models.TextField('Kommentartext')
  • 迁移\00001_initial.py
# Generated by Django 3.1.3 on 2020-11-04 20:57

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


class Migration(migrations.Migration):

initial = True

dependencies = [
]

operations = [
migrations.CreateModel(
name='Meldung',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('titel', models.CharField(max_length=100)),
('zeitstempel', models.DateTimeField()),
('text', models.TextField(verbose_name='Meldungstext')),
],
),
migrations.CreateModel(
name='Kommentar',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('autor', models.CharField(max_length=70)),
('text', models.TextField(verbose_name='Kommentartext')),
('meldung', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='news.meldung')),
],
),
]

如果按位置传递值(因此没有参数名称(,则第一个参数为id,因此'Die erste Meldung'不是分配给title,而是分配给隐式id字段。

您可以通过将其作为名为的参数传递来解决此问题:

m = Meldung(
title='Die erste Meldung',
zeitstempel=datetime.today(),
text='Nun kommt das klassische Hallo-Welt-Beispiel.'
)

也可以将None传递给id参数:

m = Meldung(
None,
'Die erste Meldung',
zeitstempel=datetime.today(),
text='Nun kommt das klassische Hallo-Welt-Beispiel.'
)

但是,正如您自己发现的那样,它使Meldung对象中的每个值都不清楚代表什么。

最新更新