【问题标题】:How can I filter DRF serializer HyperlinkedRelationField queryset based on request data?如何根据请求数据过滤 DRF 序列化程序 HyperlinkedRelationField 查询集?
【发布时间】:2018-07-12 23:34:31
【问题描述】:

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

目前,DRF 网络可浏览 HTML 表示中的端点以 html 形式显示所有帐户的所有地址。当我查询所有地址时,我会期望这一点。

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 时是否有办法访问序列化程序中的请求数据。

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

更新

非常感谢 Enthusiast Martin,根据他的回答,这就是我现在实现它的方式:

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

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

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

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

    类似这样的:

    def get_fields(self):
        fields = super().get_fields()
    
        request = self.context['request']
    
        fields['addresses'].queryset = ** your queryset using request data **
    
        return fields
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-30
      • 2017-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多