I’m trying to add an item into db.sqlite3 via command line
JavaScript
x
4
1
In [10]: m = Meldung('Die erste Meldung', zeitstempel=datetime.today(), text='Nun kommt das klassische Hallo-Welt-Beispiel.')
2
3
In [11]: m.save()
4
but got this error:
JavaScript
1
2
1
ValueError: Field 'id' expected a number but got 'Die erste Meldung'.
2
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
JavaScript
1
19
19
1
from django.db import models
2
3
4
5
6
class Meldung(models.Model):
7
titel = models.CharField(max_length=100)
8
zeitstempel = models.DateTimeField()
9
text = models.TextField('Meldungstext')
10
11
12
class Kommentar(models.Model):
13
meldung = models.ForeignKey(
14
Meldung,
15
on_delete=models.CASCADE,
16
)
17
autor = models.CharField(max_length=70)
18
text = models.TextField('Kommentartext')
19
- migrations001_initial.py
JavaScript
1
40
40
1
# Generated by Django 3.1.3 on 2020-11-04 20:57
2
3
4
from django.db import migrations, models
5
import django.db.models.deletion
6
7
8
9
10
class Migration(migrations.Migration):
11
12
13
initial = True
14
15
16
dependencies = [
17
]
18
19
20
operations = [
21
migrations.CreateModel(
22
name='Meldung',
23
fields=[
24
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
25
('titel', models.CharField(max_length=100)),
26
('zeitstempel', models.DateTimeField()),
27
('text', models.TextField(verbose_name='Meldungstext')),
28
],
29
),
30
migrations.CreateModel(
31
name='Kommentar',
32
fields=[
33
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
34
('autor', models.CharField(max_length=70)),
35
('text', models.TextField(verbose_name='Kommentartext')),
36
('meldung', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='news.meldung')),
37
],
38
),
39
]
40
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:
JavaScript
1
5
1
m = Meldung(
2
title='Die erste Meldung',
3
zeitstempel=datetime.today(),
4
text='Nun kommt das klassische Hallo-Welt-Beispiel.'
5
)
you can also pass None
to the id
parameter:
JavaScript
1
6
1
m = Meldung(
2
None,
3
'Die erste Meldung',
4
zeitstempel=datetime.today(),
5
text='Nun kommt das klassische Hallo-Welt-Beispiel.'
6
)
but it makes it unclear what each value represents in the Meldung
object, as you found out yourself.