我有一个像这样的简单模型:
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 保持不变,则会引发错误,但不应该,因为我正在更新同一对象。
最方便的方法是什么?我真的很感谢任何帮助。谢谢...
您应该排除正在更新的对象,因此:
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
。