OperationalError: no such column. In Django Rest Framework

Ivan Ro

Новичок
Пользователь
Май 3, 2020
6
1
3
Есть маленький проект - API Блога с комментариями.
Когда пытаюсь удалить статью появляется такая вот ошибка:
Exception Type:OperationalError
Exception Value:no such column: newsList_comment.article_id
Где искать эту колонку "newsList_comment.article_id", как быть?
И кроме того, не могу понять как связать правильно "комментарии к статьям" со "статьями", чтобы можно было их добавлять и просматривать?


Структура проекта:
├───newsList
│ │ admin.py
│ │ apps.py
│ │ models.py
│ │ serializers.py
│ │ tests.py
│ │ urls.py
│ │ views.py
│ │ __init__.py
│ │
│ ├──migrations
│ 0001_initial.py
│ __init__.py


└───NewsToday
asgi.py
settings.py
urls.py
wsgi.py
__init__.py

models.py

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


class Article(models.Model):
    title = models.CharField(max_length=120)
    link = models.URLField()
    created = models.DateTimeField(auto_now_add=True)
    upvotes = models.IntegerField(default=0)
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='articles')

    def __str__(self):
        return self.title


class Comment(models.Model):
    article = models.ForeignKey(Article, on_delete=models.CASCADE, related_name='comments')
    name = models.CharField(max_length=80)
    content = models.TextField()
    created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.content


views.py

Python:
from rest_framework import viewsets
from .models import Article, Comment
from .serializers import ArticleSerializer, CommentSerializer


class ArticleViewSet(viewsets.ModelViewSet):
    serializer_class = ArticleSerializer
    queryset = Article.objects.all()


class CommentViewSet(viewsets.ModelViewSet):
    serializer_class = CommentSerializer
    queryset = Comment.objects.all()


serializers.py

Python:
from rest_framework import serializers
from .models import Article, Comment


class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = ('id', 'title', 'link', 'created', 'upvotes', 'author')


class CommentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Comment
        fields = ('article', 'name', 'content', 'created')


urls.py


Python:
from rest_framework.routers import DefaultRouter
from .views import ArticleViewSet, CommentViewSet


router = DefaultRouter()
router.register(r'news', ArticleViewSet)
router.register(r'comments', CommentViewSet)
urlpatterns = router.urls
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Запустил ваш код (django==2.2.10 и djangorestframework==3.11.0), создал пару статей, комментарии к ним добавил, потом удалил статью (комментарии автоматически удалились) - ошибки не получил. Напишите как вы удаляете статью чтобы получить ошибку.
Где искать эту колонку "newsList_comment.article_id", как быть?
- newsList - это имя приложения, comment - имя модели (таблицы в БД), а article_id - вот это поле из модели
article = models.ForeignKey(Article, on_delete=models.CASCADE, related_name='comments').
И кроме того, не могу понять как связать правильно "комментарии к статьям" со "статьями", чтобы можно было их добавлять и просматривать?
Комментарии можно добавить например так:
Python:
# serializers.py
from rest_framework import serializers
from .models import Article, Comment


class CommentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Comment
        fields = ('id', 'article', 'name', 'content', 'created')


class ArticleSerializer(serializers.ModelSerializer):
    comments = CommentSerializer(many=True)

    class Meta:
        model = Article
        fields = ('id', 'title', 'link', 'created', 'upvotes', 'author', 'comments')
 
  • Мне нравится
Реакции: Ivan Ro

Ivan Ro

Новичок
Пользователь
Май 3, 2020
6
1
3
Запустил ваш код (django==2.2.10 и djangorestframework==3.11.0), создал пару статей, комментарии к ним добавил, потом удалил статью (комментарии автоматически удалились) - ошибки не получил. Напишите как вы удаляете статью чтобы получить ошибку.
- newsList - это имя приложения, comment - имя модели (таблицы в БД), а article_id - вот это поле из модели
article = models.ForeignKey(Article, on_delete=models.CASCADE, related_name='comments').

Комментарии можно добавить например так:
Python:
# serializers.py
from rest_framework import serializers
from .models import Article, Comment


class CommentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Comment
        fields = ('id', 'article', 'name', 'content', 'created')


class ArticleSerializer(serializers.ModelSerializer):
    comments = CommentSerializer(many=True)

    class Meta:
        model = Article
        fields = ('id', 'title', 'link', 'created', 'upvotes', 'author', 'comments')

Спасибо Вам за помощь, но причину я устранил и всё запустилось как положено. А причиной была "старая таблица", которую я удалил и заново создал. Видно даже makemigrations c migrate не меняли ситуацию, а полное удаление таблицы позволило создать её "адекватный аналог".
 

Форум IT Специалистов