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

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

1 Ответ

0 голосов
/ 20 ноября 2018

На ум приходят два способа - вы можете выполнить w / validation на 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...