Django.db.utils.IntegrityError: NOT NULL constraint failed: main_profile.name

Я создаю telegram бота, который является базой данных. Возникает такая ошибка:django.db.utils.IntegrityError: NOT NULL constraint failed: main_profile.name. Что я должен сделать?

Models.py

from django.db import models


class Profile(models.Model):
    external_id = models.PositiveIntegerField(
        verbose_name='User ID',
        unique=True,
    )
    name = models.TextField(
        verbose_name='User name',
        default='None'
    )

    def __str__(self):
        return f' ID: {self.external_id} | Username: {self.name}'

    class Meta:
        verbose_name = 'Profile'


class Message(models.Model):
    profile = models.ForeignKey(
        to='main.Profile',
        verbose_name='Profile',
        on_delete=models.PROTECT,
        null=True,
    )
    text = models.TextField(
        verbose_name='Text',
    )

Forms.py

from django import forms
from .models import Profile


class ProfileForm(forms.ModelForm):

    class Meta:
        model = Profile
        fields = (
            'external_id',
            'name',
        )
        widgets = {
            'name': forms.TextInput
        }

Вам нужно удалить несколько последних миграций, вы можете сделать все, кроме 0001_initial.py. Затем просто перейдите и сделайте python manage.py makemigrations your_app_name, а затем python manage.py migrate, и проблема будет решена

Вам следует посмотреть ответ выше, эта проблема почти всегда связана с миграцией, но в случае, если это не так, я предполагаю, что в поле name вашей модели Profile, если вы не укажете ограничение null=True, по умолчанию оно будет False, поэтому оно говорит, что вы обязаны дать значение (!= пустой строке), так:

если вы делаете что-то вроде этого:

def home_view(request):
    context ={}
  
    form = ProfileForm(request.POST)

    if form.is_valid():

        form.save()

    context['form']= form

    return render(request, "home.html", context)

Когда класс формы получает request, если name на входе нет данных, это будет выглядеть как {"name" : ""}, и поскольку объект запроса имеет ключ имени, сначала он не будет использовать default='None', а затем передаст его методу create в форме, и на основании ограничений, определенных для этого конкретного поля, db transaction будет подниматься django.db.utils.IntegrityError, потому что на уровне БД этому полю не разрешено быть NULL

Django docs:

"Field.null : Если True, Django будет хранить пустые значения как NULL в базе данных. По умолчанию False."

Вернуться на верх