python - Django休息框架: Duplicate key value violates unique constraint

标签 python django django-models django-rest-framework

我在使用 Django Rest Framework 时遇到问题。我正在构建的这个应用程序是 Avatar。用户可以更新他/她自己的头像,然后头像自动保存为我定义的路径(/users_id/photoset_id/filename.png)。所以我制作了这样的代码来保存函数:

def avatar_file_path(instance, filename):
    ext = filename.split('.')[-1]
    filename = '%s.%s' % (instance.id, ext)
    return "users/%s/avatar/%s_%s" %(instance.user.id, instance.photoset.id, filename)

class Avatar(models.Model):
    user = models.ForeignKey(User, related_name='avatar_set', null=True)
    photoset = models.ForeignKey(PhotoSet, null=True, blank=True)
    primary = models.BooleanField(default=True)
    caption = models.TextField(blank=True, null=True)
    image = models.ImageField(max_length=1024, upload_to=avatar_file_path)
    is_public = models.BooleanField(_('is public'), default=True, help_text=_('Public photographs will be displayed in the default views.'))
    date_uploaded = models.DateTimeField(default=datetime.datetime.now)

    def save(self, force_insert=False, force_update=False, *args, **kwargs):
        # Make one primary Avatar
        if self.primary:
            avatars = Avatar.objects.filter(user=self.user, primary=True).exclude(id=self.id)
            avatars.update(primary=False)
        # Set default photoset
        if self.photoset is None:
            if not PhotoSet.objects.filter(user=self.user, photoset_type=3).exists():
                PhotoSet.objects.create(user=self.user, photoset_type=3, title='Profile Pictures')
                self.photoset = PhotoSet.objects.get(user=self.user, photoset_type=3)
            if PhotoSet.objects.filter(user=self.user, photoset_type=3).exists():
                self.photoset = PhotoSet.objects.get(user=self.user, photoset_type=3)
        # Model Save override 
        if self.id is None:
            saved_image = self.image
            self.image = None
            super(Avatar, self).save(*args, **kwargs)
            self.image = saved_image
        super(Avatar, self).save(force_insert, force_update, *args, **kwargs)

当我使用 Django Rest Framework 创建序列化器 POST 时:

class AvatarCreateUpdateSerializer(ModelSerializer):
    class Meta:
        model = Avatar
        fields = [
            'user',
            'image',
            'caption',
            'is_public',
        ]

出现问题: enter image description here

错误日志跟踪: super(Avatar, self).save(force_insert, force_update, *args, **kwargs)

为什么我会遇到这个问题以及如何解决这个问题?预先感谢您!

最佳答案

您正在模型的基类上调用两次 save() 方法:

这里:

 super(Avatar, self).save(*args, **kwargs)

这里:

 super(Avatar, self).save(force_insert, force_update, *args, **kwargs)

正如下面的评论所说,您应该使用 update_or_createget_or_create 来处理这样的情况。

关于python - Django休息框架: Duplicate key value violates unique constraint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47426979/

相关文章:

Python requests.packages.urllib3.connection.VerifiedHTTPSConnection [Errno 11004]

javascript - Django 表单和 javascript 或者其他一些方法可以做到同样的事情

python - 带有模型的 Django QuerySet

javascript - 未捕获的类型错误 : svg. append(...).attr(...).selectAll(...).data(...).enter 不是函数

python - 如何在 Django 中连接两个模型的结果?

Python - 查找列表中的值位置并输出为新列表

python - Pandas - 将两列转换为一个新列作为字典

Django ORM "get"转换为 SQL

django - 使用 Django 根据记录中的字段高效更新大量记录

python - Pyttsx 语音性别