2016-01-21 26 views
0

我有一個查詢集,我想將函數(port_to_app)應用於其字段(dst_port)。然後從模板訪問它。我怎麼做?我已閱讀過濾器和標籤,但無法理解他們的工作方式。Django。將函數應用於查詢集

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 %} 

回答

0

模型對象上的port_to_app是不可用,因爲top_app使用.values,因此返回一個字典列表。嘗試調整您的查詢設置爲這樣的代替:

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 
+0

謝謝!最後我設法做到了。 –

0

好了,你可以標記是一個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 %} 
+0

可以將此屬性應用於queryset嗎? –