这是我的models.py文件,它使用AutoField作为主键,因此它是唯一的。正如我所读,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问题。
如何确保添加唯一字段?
感谢任何帮助。
答案 0 :(得分:1)
我刚开始使用django,所以我一直坚持这个。 这是我尝试过的。
正如domino建议我删除了Django自动处理的post_id字段,创建了一个名为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在另一个答案中放弃表格的问题 - 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
。