У меня есть следующие модели.
class ServerGroup(models.Model):
name = models.SlugField(unique=True)
factor = models.IntegerField()
class ServerGroupMember(models.Model):
class Meta:
unique_together = (
("server_group", "position"),
("server_group", "server"),
)
position = models.IntegerField()
server_group = models.ForeignKey(
"ServerGroup", related_name="servers", on_delete=models.CASCADE
)
server = models.ForeignKey("Server", on_delete=models.CASCADE)
У ServerGroup есть пара свойств, name
и factor
, и коллекция ServerGroupMember
объектов. Каждый объект ServerGroupMember
содержит целое число position
и ссылку на объект Server
. Для данного ServerGroup
position
должно быть уникальным, а для данного ServerGroup
server
должно быть уникальным. Однако в глобальном плане объекты и серверные объекты не обязательно должны быть уникальными, так как в 2 ServerGroups может содержаться сервер в позиции 1, и один и тот же сервер может появляться в нескольких группах серверов, но не несколько раз в одной и той же группе серверов.
Учитывая, что у меня есть следующие сериализаторы, как я могу проверить выше? В настоящее время модель проверяет условие на уровне базы данных, но выдает уникальную ошибку ограничения, если я пытаюсь ее нарушить. То, что я хочу, это иметь возможность обнаруживать это в моих представлениях, так что я могу вернуть соответствующий ответ на сообщение об ошибке проверки, прежде чем он сможет поразить БД и вызвать это исключение.
class ServerGroupMemberSerializer(serializers.ModelSerializer):
class Meta:
model = models.ServerGroupMember
fields = ("position", "server")
server = serializers.SlugRelatedField(
slug_name="name", queryset=models.Server.objects.all()
)
class SrvereGroupSerializer(serializers.ModelSerializer):
class Meta:
model = models.ServerrGroup
fields = ("name", "factor", "servers")
servers = ServerGroupMemberSerializer(many=True, required=False)
def create(self, validated_data): ...
def update(self, validated_data): ...