I'm receiving the following OperationError when I try to add a new post using my superuser on the admin site.
OperationalError at /admin/blog/post/add/
table blog_post has no column named author_id
Request Method: POST
Request URL: http://127.0.0.1:8000/admin/blog/post/add/
Django Version: 4.2.1
Exception Type: OperationalError
Exception Value:
table blog_post has no column named author_id
I'm sure I'm doing something wrong in my models.py This is the class I created for this table
class Post(models.Model):
class Status(models.TextChoices):
DRAFT = 'DF', 'Draft'
PUBLISHED = 'PB', 'Published'
title = models.CharField(max_length = 250)
slug = models.SlugField(max_length=250)
author = models.ForeignKey(User,
on_delete=models.CASCADE,
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=2,
choices=Status.choices,
default=Status.DRAFT)
class Meta:
ordering = ['-publish']
indexes = [
models.Index(fields=['-publish']),
]
def __str__(self) -> str:
return self.title
I just have set admin.py and settings.py to recognize the class, and database migrations are done but the error persists.
The migration file:
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Post',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=250)),
('slug', models.SlugField(max_length=250)),
('body', models.TextField()),
('publish', models.DateTimeField(default=django.utils.timezone.now)),
('created', models.DateTimeField(auto_now_add=True)),
('updated', models.DateTimeField(auto_now=True)),
('status', models.CharField(choices=[('DF', 'Draft'), ('PB', 'Published')], default='DF', max_length=2)),
],
options={
'ordering': ['-publish'],
'indexes': [models.Index(fields=['-publish'], name='blog_post_publish_bb7600_idx')],
},
),
]
Here are the results of python manage.py showmigrations
admin
[X] 0001_initial
[X] 0002_logentry_remove_auto_add
[X] 0003_logentry_add_action_flag_choices
auth
[X] 0001_initial
[X] 0002_alter_permission_name_max_length
[X] 0003_alter_user_email_max_length
[X] 0004_alter_user_username_opts
[X] 0005_alter_user_last_login_null
[X] 0006_require_contenttypes_0002
[X] 0007_alter_validators_add_error_messages
[X] 0008_alter_user_username_max_length
[X] 0009_alter_user_last_name_max_length
[X] 0010_alter_group_name_max_length
[X] 0011_update_proxy_permissions
[X] 0012_alter_user_first_name_max_length
blog
[X] 0001_initial
contenttypes
[X] 0001_initial
[X] 0002_remove_content_type_name
sessions
[X] 0001_initial
Typically you wouldn't access the column by using 'author_id' it would be accessed using 'authur.id'. Django does a lot of manipulations behind the scene. It has to translate the table into a class, and the class convention uses a period instead of an underscore. Could you provide the code where you're trying to access the column if this doesn't work?