Django的。将函数应用于查询 [英] Django. Apply function to queryset

查看:147
本文介绍了Django的。将函数应用于查询的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个查询器,我想要将函数(port_to_app)应用于其字段(dst_port)。然后从模板访问它。我怎么做?我已经阅读过滤器和标签,但无法理解他们的工作方式。



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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆