如何根据请求数据过滤DRF序列化程序HyperlinkedRelationField查询集?

时间:2018-07-12 13:42:50

标签: django django-rest-framework

我的用户帐户权限存储在request.session.get('authority')

目前,DRF的Web浏览HTML表示形式中的终结点以html形式显示所有帐户的所有地址。我在查询所有地址时期望的。

Screenshot of DRF form DRF表单的屏幕截图:地址正在显示其授权机构。uuid,它们应仅显示当前授权机构的地址数据。

公司序列化器

# ToDo: filter queryset objects
class CompanySerializer(serializers.ModelSerializer):
    clients = serializers.HyperlinkedRelatedField(
        many=True,
        view_name='client-detail',
        queryset=Client.objects.all()
    )
    addresses = serializers.HyperlinkedRelatedField(
        many=True,
        view_name='address-detail',
        queryset=Address.objects.all()
    )

    class Meta:
        model = Company
        fields = ('name', 'url', 'clients', 'addresses')
        read_only_fields = ('authority',)

我希望能够做类似的事情:

addresses = serializers.HyperlinkedRelatedField(
        many=True,
        view_name='address-detail',
        queryset=Address.objects.filter(authority=request.session.get('authority'))
    )

但是,当我设置HyperlinkedRelatedField时,不确定是否有一种方法可以访问序列化程序中的请求数据。

也许我完全以错误的方式来解决这个问题。任何指导将不胜感激。

更新

非常感谢热情的马丁,根据他的回答,这就是我现在如何实施它:

def hyperlinkedRelatedFieldByAuthority(model, view_name, authority):
    return serializers.HyperlinkedRelatedField(
        many=True,
        view_name=view_name,
        queryset=model.objects.filter(authority=authority)
    )

class CompanySerializer(serializers.ModelSerializer):
    def get_fields(self):
        fields = super().get_fields()

        authority = self.context['request'].session.get('authority')
        fields['clients'] = hyperlinkedRelatedFieldByAuthority(Client, 'client-detail', authority)
        fields['addresses'] = hyperlinkedRelatedFieldByAuthority(Address, 'address-detail', authority)

        return fields

1 个答案:

答案 0 :(得分:1)

您可以覆盖序列化程序的get_fields方法并更新地址queryset。

您可以通过序列化程序的上下文访问请求

类似这样的东西:

def get_fields(self):
    fields = super().get_fields()

    request = self.context['request']

    fields['addresses'].queryset = ** your queryset using request data **

    return fields