我有一个模特:
class UserProfile(models.Model):
user = models.OneToOneField(User)
first_name = models.CharField(max_length=30, default='anon')
last_name = models.CharField(max_length=30, default='anon')
interest = models.CharField(max_length=30, default='nothing')
def __str__(self):
return 'Username:%s' % self.user.username
class Post(models.Model):
title = models.TextField(default='No title')
text = models.TextField(max_length=220)
vote = models.IntegerField(default=0)
user_post = models.ForeignKey(User, related_name='post')
class Comments(models.Model):
name = models.TextField(default='Anon', null=True)
comment = models.TextField(max_length=2000, null=True)
post = models.ForeignKey(Post)
def __str__(self):
return 'comment:%s' % self.comment
在帖子中,您可以看到我将帖子与用户关联起来。我读到你可以使用user.post_set.all()以这种方式访问用户评论,所以我试了一下。当我尝试迁移更改(在Post中添加foriegn键)时,我收到错误。
django.db.utils.IntegrityError: NOT NULL constraint failed:
boardapp_post__new.user_post_id
我注意到post__new,所以这里是我的名为new的视图,它会创建一个帖子。
def new(request):
if request.method == 'POST':
post = Post.objects.create(title=request.POST.get('post_title', ''),
text=request.POST.get('post_text',''),vote=0
)
return HttpResponseRedirect(reverse('view_post', args=(post.id,)))
return render(request, 'new.html')
我是在django中创建用户的新手,并且对于null null consraint失败的地方感到困惑。感谢
答案 0 :(得分:0)
迁移到新的数据库格式时,对于已存在的css
,应该有一个默认的User
。
Django会尝试在现有的user_post
中为您填写此值,但它不知道要选择哪个值,因为当前模型中不允许user_post
。
因此:你需要告诉Django 1)不要担心没有用户的帖子(null
)或2)提供默认的null = True
,这有点难(可能需要一个函数调用在运行中创建一些虚拟User
。
因此,最简单的解决方案是更改User
模型并更改Post
:
user_post
答案 1 :(得分:0)
它失败了,因为你的模型字段是
user_post = models.ForeignKey(User, related_name='post')
这意味着每个帖子都将分配给用户(非空字段)。 在您看来,您没有将任何用户分配到帖子,因此请将代码更改为
post = Post.objects.create(title=request.POST.get('post_title', ''),
text=request.POST.get('post_text',''), vote=0, user_post=request.user
)