从serializ中的RetrieveAPIView中筛选字段

2024-10-03 23:20:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个模型结构,其中一个Outage有许多Product,每个Product都与一个Client相关联。在

当我获得客户机的停机列表时,我可以使用OutageSerializer来确保停机中列出的产品属于该客户机,如下所示:

class OutageSerializer(serializers.ModelSerializer):
    class Meta:
        model = Outage

    def __init__(self, *args, **kwargs):
        super(OutageSerializer, self).__init__(*args, **kwargs)
        client_id = self.context.get("client_id")
        if client_id:
            if 'products' in self.fields and \ 
                    hasattr(self.fields['products'], 'child_relation'):
                product_ids = ClientManager(client_id).client_products().\
                    values_list('pk', flat=True)
                self.fields['products'].child_relation.queryset = \
                    self.fields['products'].child_relation.queryset.\
                        filter(id__in=product_ids)

但是,如果我只通过RetrieveAPIView得到一次中断,那么child_relation属性就不再可用了,所以我必须寻找其他方法。在

目前,我正在检查*args的长度,并在那里放置一个products字段的过滤器,如下所示:

^{pr2}$

请记住,products字段不是我要过滤的唯一字段。在

目前,API仅用于GET。在

虽然这种方法“有效”,但似乎有点混乱。是否有一种首选的标准方法来筛选RetrieveAPIViews的列表字段?在


Tags: 方法selfclientidchildfields列表客户机
1条回答
网友
1楼 · 发布于 2024-10-03 23:20:40

如果Product具有Outage和{}的FKs,则可以使用SerializerMethodField。在

class OutageSerializer(serializers.ModelSerializer):

    products = serializers.SerializerMethodField()

    def get_products(self, outage):
        products_qs = outage.products.filter(client=self.context['request'].client)
        return ProductSerialzier(products_qs, many=True).data

相关问题 更多 >