我有一个模型结构,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的列表字段?
答案 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为Product
且Outage
的相关名称为Client
,则可以使用products
。
SerializerMethodField