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."