【问题标题】:IntegrityError when saving model object second time第二次保存模型对象时出现 IntegrityError
【发布时间】:2014-06-15 06:37:34
【问题描述】:

我有一个带有 OneToOneField 的 Post 模型到 User 模型

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)

【问题讨论】:

    标签: python django django-models sqlite django-forms


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2021-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多