簡體   English   中英

Django Runserver失敗,並出現django.db.utils.IntegrityError:NOT NULL約束失敗:reviewer_post.post_id(AutoField)

[英]Django runserver fails with django.db.utils.IntegrityError: NOT NULL constraint failed: reviewer_post.post_id (AutoField)

這是我的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的錯誤django.db.utils.IntegrityError: NOT NULL constraint failed: reviewer_post.post_id

我試圖在服務器啟動期間在數據庫中添加一些記錄,並且在沒有唯一字段的情況下它可以工作,但是當我更新模型文件以使兩個字段唯一的post和post_id時,post_id開始出現問題。

如何確保添加唯一字段才能工作?

任何幫助表示贊賞。

我剛開始使用django,所以我一直堅持下去。 這就是我嘗試過的方法。

正如多米諾骨牌建議的那樣,我刪除了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ánDeccico如何在SO的另一個答案中刪除表- 如何在DJango中從SQLite3中刪除表? 首先,我這樣做了,還刪除了migrations文件夾。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM