第二次保存模型对象时出现IntegrityError

0 投票
1 回答
698 浏览
提问于 2025-04-18 04:44

我有一个帖子模型,它和用户模型之间有一对一的关系。

class Post(models.Model):
    user = models.OneToOneField(User)
    title = models.CharField(max_length=255)
    content = models.TextField()
    date = models.DateField(auto_now_add = True)

    def __unicode__(self):
         return self.title

当我添加一个新帖子(通过表单)时,一切都正常。但是当我添加第二个帖子,并且使用同一个用户时,我就会遇到UNIQUE constraint failed: socnet_post.user_id的错误。

我使用了一个自定义的认证后端:

from django.contrib.auth.models import User

class EmailAuthBackend(object):
    def authenticate(self, username=None, password=None):
        try:
            user = User.objects.get(email=username)
            if user.check_password(password):
                return user
        except User.DoesNotExist:
            return None
    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

异常是从post.save()这一行抛出的:

@login_required
def profile(request, username=None):
    context = RequestContext(request)

    if not username:
        username = request.user.username

    user = User.objects.get(username=username)
    posts = Post.objects.filter(user=user)

    context_dict = {'posts': posts}

    if request.method == 'POST':
        form = AddPostForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.user = request.user
            post.save()

    add_post_form = AddPostForm()
    context_dict['add_post_form'] = add_post_form
    return render_to_response('socnet/profile.html', context_dict, context)

1 个回答

1

看起来你应该使用外键,而不是一对一的字段,因为这是一个一对多的关系(一个用户可以写很多文章):

class Post(models.Model):
    user = models.ForeignKey(User)
    title = models.CharField(max_length=255)
    content = models.TextField()
    date = models.DateField(auto_now_add = True)

    def __unicode__(self):
         return self.title

撰写回答