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

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

我正在创建一个电报机器人,它是一个数据库。如果'@usename == None' returns django.db.utils.IntegrityError: NOT NULL constraint failed: main_profile.name What should I do ?

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应该就解决了

你应该看看上面的答案,这个问题几乎总是与迁移有关,但如果不是,我猜你的 Profilename 字段] 模型,如果你没有指定约束 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)

当表单 class 收到 request 如果 name 输入中没有数据,它看起来像 {"name" : ""},因为请求对象首先有名称键,它不会使用 default='None' 然后将它传递给表单中的 create 方法,并根据为该特定字段定义的约束,db transaction 会增加 django.db.utils.IntegrityError 因为在数据库级别,该字段不允许 NULL

Django 文档:

"Field.null :如果为 True,Django 将在数据库中将空值存储为 NULL。默认为 False。"