【问题标题】:Django. Apply function to queryset姜戈。将函数应用于查询集
【发布时间】:2016-04-28 01:16:29
【问题描述】:

我有一个查询集,我想将函数 (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 %}

【问题讨论】:

    标签: python django django-models django-templates


    【解决方案1】:

    模型对象上的port_to_app 不可用,因为top_app 使用.values 并因此返回一个字典列表。尝试将您的 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
    

    【讨论】:

      【解决方案2】:

      好吧,你可以将is标记为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 %}
      

      【讨论】:

      • 这个属性可以应用于查询集吗?
      猜你喜欢
      • 2013-02-22
      • 1970-01-01
      • 2020-12-10
      • 2016-05-02
      • 2020-08-17
      • 2011-01-25
      • 2017-11-07
      • 2021-10-12
      • 2020-07-02
      相关资源
      最近更新 更多