Как предотвратить ошибку целостности в модели django

#django #django-models

Вопрос:

Я изучаю django и следую за этим проектом блога на youtube-канале codemy: https://www.youtube.com/watch?v=_ph8GF84fX4amp;ab_channel=Codemy.comCodemy.com И я хотел улучшить свой код с помощью ForeignKey, но я застрял.

Я хочу добавить категорию в свою почтовую модель. Поэтому я воспользовался иностранным ключом. Не в каждом посте есть категория, так как я добавил эту модель совсем недавно, но я использовал аргумент по умолчанию в классе Категория, который должен решить эту проблему. Однако, попробовав несколько вариантов, я не могу перенести свои модели и снова запустить сервер.

Мой код:

 from django.db import models
from django.contrib.auth.models import User
from django.urls import reverse

class Category(models.Model):
    cat_name = models.CharField(max_length=300, default="uncategorized")

    def get_absolute_url (self):
        return reverse("blog")

    def __str__(self):
        return self.cat_name

class Post(models.Model):
    title = models.CharField(max_length=300)
    author = models.ForeignKey(User, on_delete = models.CASCADE)
    body = models.CharField(max_length=30000)
    date = models.DateField(auto_now_add=True)
    category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True)

    def get_absolute_url (self):
        return reverse("post", args = [str(self.id)])
 

Ошибка:
django.db.utils.Ошибка целостности: Строка в таблице «blog_post» с первичным ключом «1» имеет недопустимый внешний ключ: blog_post.category_id содержит значение «без категории», которое не имеет соответствующего значения в blog_category.id.

Я использовал эту категорию в своем forms.py:

 class PostForm(forms.ModelForm):
class Meta:
    model = models.Post
    fields = ["title", "author", "category", "body"]
    widgets = {
        "title": forms.TextInput(attrs={"class": "form-control"}),
        "author": forms.Select(attrs={"class": "form-control"}),
        "category": forms.Select(attrs={"class": "form-control"}),
        "body": forms.Textarea(attrs={"class": "form-control"}),
    }
 

который используется в моих представлениях:

  from django.shortcuts import render
from django.views.generic.base import TemplateView
from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView
from . import models
from.forms import PostForm
from django.urls import reverse_lazy



class IndexView(TemplateView):
    template_name = "index.html"

class PostListView(ListView):
    model = models.Post
    template_name = "post_list.html"
    #ordering = ["-id"]

class PostDetailView(DetailView):
    model = models.Post
    template_name = "post_detail.html"

class AddPostView(CreateView):
    model = models.Post
    form_class = PostForm
    template_name = "add_post.html"
    #fields = ["title", "author", "body"]

class UpdatePostView(UpdateView):
    model = models.Post
    form_class = PostForm
    template_name = "update_post.html"
    #fields = ["title", "body"]

class DeletePostView(DeleteView):
    model = models.Post
    template_name = "delete_post.html"
    success_url = reverse_lazy("blog")
 

Комментарии:

1. можете ли вы опубликовать свои мнения?

2. Привет, я отредактировал свой вопрос, чтобы он показывал больше кода. Я не уверен, помогает ли это для ориентации…. Согласно предложению об ошибке, я считаю, что проблема в модели… Большое спасибо за помощь!

3. можете ли вы удалить файлы миграции и выполнить повторную миграцию один раз

4. хорошо, это немного продвинуло меня вперед, я могу запустить сервер. Однако всякий раз, когда мне нужна страница, модель публикации, которую я получаю: в таблице blog_post нет столбца с именем category_id

5. какое представление вы используете в URL-адресе?