我的用户帐户权限存储在request.session.get('authority')
目前,DRF的Web浏览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时,不确定是否有一种方法可以访问序列化程序中的请求数据。
也许我完全以错误的方式来解决这个问题。任何指导将不胜感激。
更新
非常感谢热情的马丁,根据他的回答,这就是我现在如何实施它:
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
答案 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