Python 如何筛选列表是否包含参数?
如何筛选列表是否包含参数 在Django Rest Framework项目中,我列出了物理_服务器:Python 如何筛选列表是否包含参数?,python,django,django-queryset,Python,Django,Django Queryset,如何筛选列表是否包含参数 在Django Rest Framework项目中,我列出了物理_服务器: [ { "id": 23, "name": 'A1' "ipv4s": [ { "id": 313, "ip": "43.243.33.33", "netmask": "255.255.255.248",
[
{
"id": 23,
"name": 'A1'
"ipv4s": [
{
"id": 313,
"ip": "43.243.33.33",
"netmask": "255.255.255.248",
"prefix": 29,
"is_gateway": false,
"is_network_ip": false,
"is_broadcast_ip": false,
"desc": null,
"ctime": "2018-04-26T21:17:34.868492+08:00",
"uptime": "2018-05-21T12:09:25.674283+08:00",
....
这是我的列表API视图:
class PhysicalServerListAPIView(ListAPIView):
serializer_class = PhysicalServerListSerializer
permission_classes = [AllowAny]
pagination_class = CommonPagination
def get_queryset(self):
query_params = self.request.query_params
ip_address = ''
try:
ip_address = query_params.pop('ip_address') # this maybe `43.243.33.33`
except Exception as e:
pass
qs = PhysicalServer.objects.filter(xxxx) # there I want the ip_address filtered if it in the `ipv4s`.
return qs
如何实现此过滤器?因为它不是physicalserver的属性。我不能使用过滤器(name='xxx')
来完成此操作
编辑-1
我知道我可以使用for循环来迭代queryset的IPV4,但我不确定这是否方便或有效。这样的过滤器怎么样:
def get_queryset(self):
query_params = self.request.query_params
ip_address = ''
try:
ip_address = query_params.pop('ip_address')
except Exception as e:
pass
qs = PhysicalServer.objects.all()
if ip_address:
qs = [p for p in qs if ip_address in [d['ip'] for d in p['ipv4s']]]
return qs
要按相关型号的字段筛选服务器,请使用
\uuu
符号:
ip_address = query_params.pop('ip_address')
qs = PhysicalServer.objects.filter(ipv4s__ip=ip_address)
要使服务器的ipv4
列表仅包含已过滤的ip,请使用:
现在,服务器的ipv4
将只显示过滤后的ip地址
from django.db.models import Prefetch
qs = PhysicalServer.objects.filter(ipv4s__ip=ip_address).prefetch_related(Prefetch('ipv4s', queryset=IPV4S.objects.filter(ip=ip_address))