django rest framework: параметры SlugRelatedField - ограничение пользователем - PullRequest
0 голосов
/ 27 мая 2020

Примечание: я новичок в django rest framework. Первый проект с ней. Моя модель имеет внешний ключ, который в сериализаторе я связываю с помощью SlugRelatedField. Эта связанная модель представляет собой небольшой список опций, которые можно выбрать, однако то, что доступно для выбора, зависит от пользователя (или, более конкретно, от группы пользователей).

Я нашел этот вопрос, который говорит, как ввести пользователя в серилайзер. Но это, похоже, не помогает, поскольку определение поля - stati c правильно?

Удаление нерелевантных частей, которые у меня есть:

class MyModelSerializer(serializers.ModelSerializer):

        sequence =  serializers.SlugRelatedField(
        many=False,
        read_only=False,
        slug_field='prefix',
        queryset=Sequence.objects.filter(active=True,
                sequence_groups__sequence_group_id__in=SequenceGroup.objects.filter(users=serializers.CurrentUserDefault()))
    )

Этот запрос работает, поскольку я также использую его в нормальная форма. Когда я запускаю dev. сервера, я получаю исключение:

TypeError: int() argument must be a string, a bytes-like object or a number, not 'CurrentUserDefault'

Итак, мой вопрос в том, как я могу получить текущего пользователя в запросе SlugRelatedField?

1 Ответ

0 голосов
/ 27 мая 2020

Забавно, как после нескольких часов попыток запись вопроса приводит к рабочему решению.

  1. Добавить запрос в контекст стерилизатора в ModelViewSet

    Просто добавьте ниже в ModelViewSet:

    def get_serializer_context(self):
        return {"request": self.request}
    
  2. Настройте набор запросов SlugRelatedField в конструкторе Serializer

    def __init__(self, *args, **kwargs):
        super(MyModelSerializer, self).__init__(*args, **kwargs)
        # superuser can choose from all sequences, normal users can only choose from
        # active sequences he is assigned to
        request = self.context.get("request")
        if request and hasattr(request, "user"):
            sequence = self.fields['sequence']
            if request.user.is_superuser:
                sequence.queryset = Sequence.objects.all()
            else:
                sequence.queryset = Sequence.objects.filter(active=True,
                        sequence_groups__sequence_group_id__in=SequenceGroup.objects.filter(users=request.user))
    

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

...