У меня есть приложение Django, которое использует django-organizations для поддержки общих учетных записей и rest_framework для API. У меня есть настраиваемая модель аутентификации, которая связывает пользователя с токеном API, специфичным для организации.
У меня есть модель с несколькими внешними ключами, сериализатором со связанными полями и ModelViewSet для представлений API. Я хочу убедиться, что любые вызовы API для создания или изменения экземпляров моей модели подтверждают, что объекты, указанные для связанных полей, имеют одного и того же владельца (организацию).
class Bar(models.Model):
uuid = models.UUIDField(
default=uuid.uuid4, editable=False, unique=True)
organization = models.ForeignKey(
Organization, on_delete=models.CASCADE)
class Foo(models.Model):
uuid = models.UUIDField(
default=uuid.uuid4, editable=False, unique=True)
organization = models.ForeignKey(
Organization, on_delete=models.CASCADE)
bar = models.ForeignKey(
Bar, on_delete=models.CASCADE)
class FooSerializer(serializers.ModelSerializer):
class Meta:
model = Foo
fields = ('uuid', 'organization', 'bar')
bar = serializers.SlugRelatedField(
slug_field='uuid', queryset=Bar.objects.all())
Как я могу убедиться, что связанные объекты принадлежат одной учетной записи? В идеале я мог бы переопределить набор запросов, указанный для каждого RelatedField в сериализаторе, но я не думаю, что это возможно.






На ум приходят два способа: вы можете выполнить с проверкой в ModelSerializer, но затем вам придется передать запрос в сериализатор. Мое чутье подсказывает, что в Viewset, наверное, больше смысла. Таким образом, если он обращается к чему-то, к чему у него не должно быть доступа, он возвращает 404 (меньше утечки информации).
Чтобы это было в наборе, определите get_queryset w /
def get_queryset(self)
qs = MODEL.objects.filter(relation__user=self.request.user)
return qs
Больше примеров ниже:
Что ж, вы можете переопределить метод
validateвашего FooSerializer и поднять ValidationError, если организация’bar’отличается