代码之家  ›  专栏  ›  技术社区  ›  jathanism

Django活塞:如何从处理程序结果中排除嵌套字段?有可能吗?

  •  5
  • jathanism  · 技术社区  · 14 年前

    我正在对我为使用django活塞的django应用程序编写的API进行最后的润色。API能够按请求或IP地址进行搜索,这些地址是 Request IPAddress 实例。每个请求可以有一个或多个 IP地址 与之相关。

    例如,我有一个API调用,它将显示 IP地址 与活动状态“活动”、“非活动”或“全部”匹配的对象(用于两者之一)。这个 请求 每一个 IP地址 实例关联可用为 IPAddress.request .

    我的问题是 Request.inputter User 提供请求的人的实例。当从为此API调用创建的处理程序返回结果时,来自 用户 显示实例,包括 password .

    这不好,我不想要这个。

    这里是我的处理人:

    class SearchByIPStatusHandler(BaseHandler):
        model = IPAddress
        allowed_methods = ('GET',)
        anonymous = AnonymousIPHandler
    
        def read(self, request, status):
            """
            Returns IP addresses based on activity status.  
            Status: 'active', 'inactive', 'all'
    
            """
            if status == 'all':
                return self.model.objects.all()
            else:
                active = True if (status=='active') else False
                return self.model.objects.filter(active=active)
    

    下面是一个例子 /api/show/all/ :

    <response>
      <resource>
        <updated>2010-02-05 17:08:53.651729</updated>
        <expires>2010-02-12 17:08:23</expires>
        <created>2010-02-05 17:08:53.625318</created>
        <nexthop>255.255.255.255</nexthop>
        <netmask>255.255.255.254</netmask>
        <address>2.4.6.80/31</address>
        <active>True</active>
        <id>4</id>
        <request>
          <updated>2010-02-05 17:08:53.382381</updated>
          <created>2010-02-05 17:08:53.382313</created>
          <expires>2010-02-12 17:08:23</expires>
          <incident>20100212-badthings-01</incident>
          <reason>bad things happened</reason>
          <inputter>
            <username>jathan</username>
            <first_name>Jathan</first_name>
            <last_name>McCollum</last_name>
            <is_active>True</is_active>
            <email>email@fake.notreal</email>
            <is_superuser>True</is_superuser>
            <is_staff>True</is_staff>
            <last_login>2010-02-05 18:55:51.877746</last_login>
            <password>[ENCRYPTED STRING I REDACTED]</password>
            <id>1</id>
            <date_joined>2010-01-28 09:56:32</date_joined>
          </inputter>
          <requester>joeuser</requester>
          <active>True</active>
        </request>
      </resource>
    </response>
    

    我真正想要的结果是 inputter.username 不是所有其他的东西。我尝试过各种迭代来实现 exclude 处理程序的属性无效。如果我跳过整个请求字段,那就可以了,比如:

    在处理程序中:

    exclude = ('request', )
    

    结果是:

    <response>
      <resource>
        <updated>2010-02-05 17:08:53.651729</updated>
        <expires>2010-02-12 17:08:23</expires>
        <created>2010-02-05 17:08:53.625318</created>
        <nexthop>255.255.255.255</nexthop>
        <netmask>255.255.255.254</netmask>
        <address>2.4.6.80/31</address>
        <active>True</active>
        <id>4</id>
      </resource>
    </response>
    

    但这些结果也不是我想要的。

    最后,我的问题是:

    如何从处理程序结果中排除嵌套字段?有可能吗?

    我尝试了以下的各种迭代,这些迭代要么没有结果,要么没有意外的结果:

    # try to exclude request.inputter
    exclude = ( ('request', ('inputter', ), ) )
    
    # try to exclude request.inputter.password
    exclude = ( ('request', ('inputter', ('password', ) ) ) ) 
    

    我认为我误解或误用了在这种情况下排除外场的方式,因此非常感谢对这一主题的任何启示。

    2 回复  |  直到 7 年前
        1
  •  3
  •   flanth    14 年前

    您可以通过处理程序的 fields = 条款。

    可以这样指定来自外键的模型字段:

    ('foreign_model_field', ('nested_field1', 'nested_field2'))
    

    在您的例子中,以下内容应该有效(为了简洁起见,您的一些字段被省略了):

    fields = ('updated', 'expires', 'created', 
        ('request', ('incident', 'reason', ('inputter', ('username',)))))
    
        2
  •  3
  •   jespern    14 年前

    是否可以尝试使用include而不是exclude?例如。

    include = (('request', ('inputter', ('username', 'therestofthefields'))))
    

    我不记得我是否写过 exclude 多才多艺 include .

    另外,Django活塞谷歌集团是我们讨论最多的事情的地方,你在那里问这个问题可能会更成功。