我有一个查询集,我想将函数(port_to_app)应用到它的字段(dst_port)。然后从模板中访问它。我该怎么做?我读过关于过滤器和标签的文章,但是我无法理解它们的工作方式。
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 %}
发布于 2016-01-22 03:30:46
模型对象上的port_to_app
不可用,因为top_app
使用.values
,因此返回一个dicts列表。尝试将您的QuerySet调整为类似这样的东西:
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
发布于 2016-01-21 09:02:27
嗯,你可以标记为property
@property
def port_app(self):
"returns application instead of port using socket module"
import socket
if self.dst_port:
return socket.getservbyport(int(dst_port))
然后,在模板中,您可以像其他任何模型属性一样访问它。
{% for p in top_app %}
{{ p.port_app }}
{% endfor %}
https://stackoverflow.com/questions/34929761
复制相似问题