I’m trying to add an item into db.sqlite3 via command line
In [10]: m = Meldung('Die erste Meldung', zeitstempel=datetime.today(), text='Nun kommt das klassische Hallo-Welt-Beispiel.') In [11]: m.save()
but got this error:
ValueError: Field 'id' expected a number but got 'Die erste Meldung'.
Inside migrations001_initial.py below the field id of contentobject Meldung is declared as auto_created=True, but it seems it’s not working as expected.
How can I solve it?
expected result
Field ‘id’ is generated automated by db.sqlite3environment
Python 3.8.2
Django 3.1.3models.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')
- migrations001_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')), ], ), ]
Advertisement
Answer
The first parameter if you pass the value positionally (so without the name of the parameter), is id
, so you assign 'Die erste Meldung'
not to title
but to the implicit id
field.
You can solve this by passing it as a named parameter:
m = Meldung( title='Die erste Meldung', zeitstempel=datetime.today(), text='Nun kommt das klassische Hallo-Welt-Beispiel.' )
you can also pass None
to the id
parameter:
m = Meldung( None, 'Die erste Meldung', zeitstempel=datetime.today(), text='Nun kommt das klassische Hallo-Welt-Beispiel.' )
but it makes it unclear what each value represents in the Meldung
object, as you found out yourself.