当 Slug 已经存在时 Django 引发错误

问题描述 投票:0回答:1

我有一个像这样的简单模型:

class MyModel(models.Model):
title = models.CharField(max_length=255)
slug = AutoSlugField(populate_from='title', unique=True, error_messages={'unique':"The slug of title has already been registered."})

我想在 slug 已存在时引发错误而不是创建新的 slug,但 AutoSlugField 不会引发错误

我尝试了另一种方法,重写模型的保存方法,如下所示:

def save(self, *args, **kwargs):
    self.slug = slugify(self.title)
    super(Competition, self).save(*args, **kwargs)

并在我的序列化器中验证它,如下所示:

class MyModelSerializer(serializers.ModelSerializer):
   class Meta:
      model = MyModel
      fields = '__all__'
    
  def validate_title(self, val):
      if MyModel.objects.filter(slug=slugify(val)).exists():
          raise serializers.ValidationError('The slug of title has been registered.')
      return val

这实际上在创建新对象时工作正常,但在更新对象时出现问题,因为如果 slug 保持不变,则会引发错误,但不应该,因为我正在更新同一对象。

最方便的方法是什么?我真的很感谢任何帮助。谢谢...

python django django-models slug
1个回答
1
投票

您应该排除正在更新的对象,因此:

class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = '__all__'

    def validate_title(self, val):
        qs = MyModel.objects.filter(slug=slugify(val))
        if self.instance is not None:
            qs = qs.exclude(pk=self.instance.pk)
        if qs.exists():
            raise serializers.ValidationError(
                'The slug of title has been registered.'
            )
        return val

因此,我们检查序列化器中是否有要更新的实例,如果是这种情况,我们从查询集中排除具有相同主键的对象

.pk

© www.soinside.com 2019 - 2024. All rights reserved.