How to programmatically provide `queryset` to PrimaryKeyRelatedField in DRF 3

后端 未结 2 1839
无人及你
无人及你 2021-02-02 15:14

In order to have a non-readonly PrimaryKeyRelatedField, you are required to provide a queryset that contains valid options.

How can I properly populate that

相关标签:
2条回答
  • 2021-02-02 15:56

    The key is to subclass PrimaryKeyRelatedField and overload the get_queryset method, using the user information from the request context:

    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)
    

    You can then use this new serializer just like the (unfiltered) original:

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

    Whenever the serializer accesses the queryset, it will be filtered such that only objects owned by the current user are returned.

    0 讨论(0)
  • 2021-02-02 16:12

    View has a

    self.request.user
    

    attribute which you can then use to fetch user related queryset eg

    queryset = Products.objects.get(customer=self.request.user)
    
    0 讨论(0)
提交回复
热议问题