Как я могу убедиться, что все связанные поля в сериализаторе Django REST Framework указывают объекты с одним и тем же владельцем?

У меня есть приложение 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 в сериализаторе, но я не думаю, что это возможно.

Что ж, вы можете переопределить метод validate вашего FooSerializer и поднять ValidationError, если организация ’bar’ отличается

ivissani 20.11.2018 03:24
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
209
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На ум приходят два способа: вы можете выполнить с проверкой в ​​ModelSerializer, но затем вам придется передать запрос в сериализатор. Мое чутье подсказывает, что в Viewset, наверное, больше смысла. Таким образом, если он обращается к чему-то, к чему у него не должно быть доступа, он возвращает 404 (меньше утечки информации).

Чтобы это было в наборе, определите get_queryset w /

def get_queryset(self)
    qs = MODEL.objects.filter(relation__user=self.request.user)
    return qs

Больше примеров ниже:

https://docs.djangoproject.com/en/2.1/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin.get_queryset

Другие вопросы по теме