Как программно предоставить "queryset" в PrimaryKeyRelatedField в DRF 3

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

Как я могу правильно заполнить этот queryset на основе текущего запроса (пользователя)?

2 ответов


ключ к подклассу PrimaryKeyRelatedField и перегрузить get_queryset метод, используя информацию пользователя из контекста запроса:

class UserFilteredPrimaryKeyRelatedField(serializers.PrimaryKeyRelatedField):
    def get_queryset(self):
        request = self.context.get('request', None)
        queryset = super(UserFilteredPrimaryKeyRelatedField, self).get_queryset()
        if not request or not queryset:
            return None
        return queryset.filter(user=request.user)

вы можете использовать этот новый сериализатор так же, как (нефильтрованный) оригинал:

class MySerializer(serializers.ModelSerializer):
    related = UserFilteredPrimaryKeyRelatedField(queryset=MyModel.objects)

всякий раз, когда сериализатор обращается к queryset, он будет отфильтрован таким образом, что возвращаются только объекты, принадлежащие текущему пользователю.


имеет вид

self.request.user

атрибут, который затем можно использовать для получения пользовательского queryset например!--3-->

queryset = Products.objects.get(customer=self.request.user)