【问题标题】:Django runserver fails with django.db.utils.IntegrityError: NOT NULL constraint failed: reviewer_post.post_id (AutoField)Django runserver 因 django.db.utils.IntegrityError 失败:NOT NULL 约束失败:reviewer_post.post_id (AutoField)
【发布时间】:2016-04-07 17:29:17
【问题描述】:

这是我的 models.py 文件,它使用 AutoField 作为主键,因此它是唯一的 post_id。正如我所读的那样,AutoField 会自动递增。

from django.db import models
class Post(models.Model):
    post = models.CharField(max_length=1000,unique=True)
    post_id = models.AutoField(primary_key=True)
    neg = models.IntegerField(default=0)
    pos = models.IntegerField(default=0)
    is_money= models.CharField(max_length=1,default = "y")
    def __str__(self):
        return self.post+"\tScore : "+str(self.neg+self.pos)

我有一个 startup.py 文件,它使用以下代码将记录添加到 db。我已经使用get_or_create 函数来检查帖子是否退出,否则创建它Post.objects.get_or_create(post = text ,defaults={'neg':0,'pos':0,'is_money':has_money_tags})

def add_to_db(self):
    from reviewer.models import Post
    Post.objects.all().delete()
    import django
    django.setup()
    for num,i in enumerate(self.unlabelled):
        print num
        money_tags=self.getHashTagsfromContent(i[0])
        text = re.sub(r'#[^\s]+',"",i[0])
        y_n=i[1] if i[1].strip()=='y' or i[1].strip()=='n' else  filter(None,map(lambda x : x.strip("]'[ \n\t"),i[1].split(",")))
        if isinstance(y_n,list):
            money_tags=money_tags+y_n
        has_money_tags=y_n if y_n =='y' or y_n=='n' else self.isMoney(money_tags)
        self.logger.info(str(text)+"\t"+str((num+1))+"\t"+str(has_money_tags)+"\n")

        p,created=Post.objects.get_or_create(post = text ,defaults={'neg':0,'pos':0,'is_money':has_money_tags})

def run():
    r=Reviewer_Data()
    r.add_to_db()

这是在 makemigrations 之后创建的 Migrations 类

class Migration(migrations.Migration):

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='Post',
            fields=[
                ('post', models.CharField(unique=True, max_length=1000)),
                ('post_id', models.AutoField(serialize=False, primary_key=True)),
                ('neg', models.IntegerField(default=0)),
                ('pos', models.IntegerField(default=0)),
                ('is_money', models.CharField(default=b'y', max_length=1)),
            ],
        ),
    ]

当我执行 python manage.py runserver 时。它给了我列 post_id django.db.utils.IntegrityError: NOT NULL constraint failed: reviewer_post.post_id 的错误

我试图在服务器启动期间在数据库中添加一些记录,当没有唯一字段时它可以工作,但是当我更新我的模型文件以使两个字段唯一的 post 和 post_id 时,它开始出现 post_id 问题。

如何确保添加一个唯一的字段才能工作?

感谢任何帮助。

【问题讨论】:

  • SO 上与此类似的其他问题无助于解决问题。他们似乎有点不同。
  • 您创建自己的主键字段而不是仅使用 django 自动生成的主键字段的任何特殊原因?
  • @domino 我需要使用 post_id 来串行获取记录。一旦我完成了页面上的记录,页面将重定向到下一条记录。我想我可以把它作为主键,这样我就不需要使用唯一的,并且会少一个字段。
  • Django 会自动为您创建一个主键字段,该字段完全符合您的要求。你不需要自己创建一个。
  • @domino 知道了id = models.AutoField(primary_key=True) Django 会自动执行此操作docs.djangoproject.com/en/1.9/topics/db/models/…

标签: python django sqlite


【解决方案1】:

我刚开始使用 django,所以我一直被这个问题困扰。 这是我尝试过的方法。

正如 domino 建议的那样,我删除了 Django 自动处理创建名为 id 的主键的 post_id 字段。这是我现在的 models.py 文件。

from django.db import models
class Post(models.Model):
    post = models.CharField(max_length=1000,unique=True)
    neg = models.IntegerField(default=0)
    pos = models.IntegerField(default=0)
    is_money= models.CharField(max_length=1,default = "y")
    def __str__(self):
        return self.post+"\tScore : "+str(self.neg+self.pos)

我已删除迁移文件夹。我之前没有做过syncdb。我还在学习中,我对Django 还远远落后。

这就是 Adrián Deccico 在 SO - How do I drop a table from SQLite3 in DJango? 的另一个答案中删除表格的方式。首先,我这样做并删除了迁移文件夹。

./manage.py sqlclear reviewer | ./manage.py dbshell 
./manage.py syncdb

然后是python manage.py migrate,然后是python manage.py sqlmigrate reviewer 0001,然后是python manage.py runserver

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多