Django的。将函数应用于查询 [英] Django. Apply function to queryset
问题描述
models.py
$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $值('dst_port')\
.annotate(traffic = Sum('bytes'))。order_by(' - traffic')[:10]
class Flow(models.Model )
id = models.BigIntegerField(primary_key = True)
ip_src = models.CharField(max_length = 15)
ip_dst = models.CharField(max_length = 15)
src_port = models.IntegerField()
dst_port = models.IntegerField()
objects = FlowQuerySets.as_manager()
def port_to_app(self):
返回应用程序代替端口使用套接字模块
import socket
if self.dst_port:
return socket.getservbyport(int(dst_port))
/ pre>
views.py
def top_conversations_app(request):
top_app = Flow.objects.top_app()
return render(request,'flow / home.html' ,{'top_app':top_app})
home.html
{%for top in top_app%}
{{p.dst_port}}
{{p.traffic | fileizeformat}}
{%endfor%}
模型对象上的 port_to_app
不可用,因为 top_app
使用 .values
并返回列表。尝试调整您的QuerySet到这样的代码:
类FlowQuerySets(models.QuerySet):
def top_app(self):
import socket
for obj in self.values('dst_port')\
.annotate(traffic = Sum('bytes'))。order_by ('-traffic')[:10]:
如果obj ['dst_port']:
obj ['dst_port'] = socket.getservbyport(int(obj ['dst_port']))
yield obj
I have a queryset and I want to apply function (port_to_app) to its field (dst_port). And then access it from template. How do I do that? I've read about filters and tags, but can't understand the way they work.
models.py
class FlowQuerySets(models.QuerySet):
def top_app(self):
return self.values('dst_port')\
.annotate(traffic=Sum('bytes')).order_by('-traffic')[:10]
class Flow(models.Model):
id = models.BigIntegerField(primary_key = True)
ip_src = models.CharField(max_length=15)
ip_dst = models.CharField(max_length=15)
src_port = models.IntegerField()
dst_port = models.IntegerField()
objects = FlowQuerySets.as_manager()
def port_to_app(self):
"returns application instead of port using socket module"
import socket
if self.dst_port:
return socket.getservbyport(int(dst_port))
views.py
def top_conversations_app(request):
top_app = Flow.objects.top_app()
return render (request, 'flow/home.html', {'top_app': top_app})
home.html
{% for p in top_app %}
{{ p.dst_port }}
{{ p.traffic | filesizeformat}}
{% endfor %}
The port_to_app
on the model object is not available because top_app
uses .values
and thus returns a list of dicts. Try adjusting your QuerySet to something like this instead:
class FlowQuerySets(models.QuerySet):
def top_app(self):
import socket
for obj in self.values('dst_port')\
.annotate(traffic=Sum('bytes')).order_by('-traffic')[:10]:
if obj['dst_port']:
obj['dst_port'] = socket.getservbyport(int(obj['dst_port']))
yield obj
这篇关于Django的。将函数应用于查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!