【问题标题】:IntegrityError at /admin/main/category/add/ NOT NULL constraint failed: main_category.author_id/admin/main/category/add/ NOT NULL 约束处​​的 IntegrityError 失败:main_category.author_id
【发布时间】:2016-01-02 17:06:06
【问题描述】:

我不确定为什么会发生此错误。它发生在我限制一个用户只创建一个类别之后。但我希望能够在管理页面中创建多个类别页面。我曾尝试通过管理页面创建类别页面,但它给了我错误:

IntegrityError at /admin/main/category/add/
NOT NULL constraint failed: main_category.author_id

我什至不确定它发生在哪里。

Exception Type: IntegrityError at /admin/main/category/add/
Exception Value: NOT NULL constraint failed: main_category.author_id

完整性错误

Exception Value:    
Exception Location: /Desktop/ebagu0.2/env/local/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py in execute, line 318
Python Executable:  Desktop/ebagu0.2/env/bin/python

我的模型

class Category(models.Model): 
    name = models.CharField(max_length=128, unique=True)
    slug = models.CharField(max_length=100, unique=True)
    author = models.OneToOneField(settings.AUTH_USER_MODEL, unique=True)
    def save(self, *args, **kwargs):
        self.slug = uuslug(self.name,instance=self, max_length=100)
        super(Category, self).save(*args, **kwargs)

我的看法

@login_required
def add_category(request):
    if Category.objects.filter(author=request.user).exists():
        return render(request,'main/category_already_exists.html')
    if request.method == 'POST':
        category = Category(author=request.user)
        form = CategoryForm(request.POST, instance=category)
        if form.is_valid():
            form.save(commit=True)
            return redirect('index')

    else:
        form = CategoryForm()

    return render(request, 'main/add_category.html', {'form':form})

我的管理员

class CatAdmin(admin.ModelAdmin): 

    prepopulated_fields = {'slug':('name',)}
    fields = ['name', 'slug']

【问题讨论】:

  • 这是 SQLite3 吗?我正在查看您的异常位置中的文件路径。
  • 是的,它是从那里发生的吗?我仍然在我的本地,我愿意删除并重新安装 db
  • 您的视图完全无关紧要,因为此错误发生在管理员中。它的逻辑是正确的,因为如果它在那里发生,它将解决这个问题,但事实并非如此:您的错误清楚地表明它正在管理添加类别页面中发生。您需要某种方式来使用该逻辑。
  • 根据您的错误,您尝试保存 main_category 而不指定 author_id。查看您的视图,可能request.user 在分配给作者时未设置。如果作者是必填字段,则应在您的管理员中进行检查。
  • 而错误的原因是你只在你的管理类中包含了 name 和 slug 字段的 Category ,所以 author 将永远是 None ,你在定义中禁止了作者字段。

标签: python django sqlite


【解决方案1】:
异常值:NOT NULL 约束失败:main_category.author_id

您忘记通过管理员设置author

class CatAdmin(admin.ModelAdmin): 

    prepopulated_fields = {'slug':('name',)}
    fields = ['name', 'slug', 'author']
    #                       ^^^^^^^^^^

根据您的需要,您可能希望将 author 字段设为可选:

class Category(models.Model): 
    ...
    # remove unique=True, add null=True
    author = models.OneToOneField(settings.AUTH_USER_MODEL, null=True)
    #                                                       ^^^^^^^^^
    ...

顺便提一下,对于非空的OneToOneField,指定unique=True 是多余的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-01
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多