从序列化程序中的RetrieveAPIView过滤字段

时间:2017-02-12 23:30:07

标签: python django-rest-framework

我有一个模型结构,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字段的过滤器,如下所示:

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:
                if 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)
                elif len(args) == 1 and hasattr(args[0], 'products'):
                    product_ids = ClientManager(client_id).client_products().\
                        values_list('pk', flat=True)
                    args[0].products = \
                        args[0].products.filter(id__in=products_ids)

请注意,products字段不是我想要过滤的唯一字段。

目前,API仅用于GET。

虽然这种方法“有效”,但似乎有些混乱。是否有一种首选的标准方法来过滤RetrieveAPIView s的列表字段?

1 个答案:

答案 0 :(得分:0)

如果String sql = "SELECT e FROM Employee e LEFT JOIN e.address a WITH a.city = :city" Query query = session.createQuery( sql ); query.setParameter( "city", "New York" ); List results = query.getResultList(); 的FK为ProductOutage的相关名称为Client,则可以使用products

SerializerMethodField