Workaround unique validation

This commit is contained in:
shamoon 2024-06-30 08:10:49 -07:00
parent b922c85c36
commit 3714e4451e

View File

@ -261,6 +261,24 @@ class OwnedObjectSerializer(
) )
# other methods in mixin # other methods in mixin
def validate_unique_together(self, validated_data, instance=None):
# workaround for https://github.com/encode/django-rest-framework/issues/9358
if "owner" in validated_data and "name" in self.Meta.fields:
name = validated_data.get("name", instance.name if instance else None)
objects = (
self.Meta.model.objects.exclude(pk=instance.pk)
if instance
else self.Meta.model.objects.all()
)
not_unique = objects.filter(
owner=validated_data["owner"],
name=name,
).exists()
if not_unique:
raise serializers.ValidationError(
{"error": "Object violates owner / name unique constraint"},
)
def create(self, validated_data): def create(self, validated_data):
# default to current user if not set # default to current user if not set
request = self.context.get("request") request = self.context.get("request")
@ -272,6 +290,7 @@ class OwnedObjectSerializer(
permissions = None permissions = None
if "set_permissions" in validated_data: if "set_permissions" in validated_data:
permissions = validated_data.pop("set_permissions") permissions = validated_data.pop("set_permissions")
self.validate_unique_together(validated_data)
instance = super().create(validated_data) instance = super().create(validated_data)
if permissions is not None: if permissions is not None:
self._set_permissions(permissions, instance) self._set_permissions(permissions, instance)
@ -280,17 +299,7 @@ class OwnedObjectSerializer(
def update(self, instance, validated_data): def update(self, instance, validated_data):
if "set_permissions" in validated_data: if "set_permissions" in validated_data:
self._set_permissions(validated_data["set_permissions"], instance) self._set_permissions(validated_data["set_permissions"], instance)
if "owner" in validated_data and "name" in self.Meta.fields: self.validate_unique_together(validated_data, instance)
name = validated_data.get("name", instance.name)
not_unique = (
self.Meta.model.objects.exclude(pk=instance.pk)
.filter(owner=validated_data["owner"], name=name)
.exists()
)
if not_unique:
raise serializers.ValidationError(
{"error": "Object violates owner / name unique constraint"},
)
return super().update(instance, validated_data) return super().update(instance, validated_data)