Django Piston: Как я могу исключить вложенные поля из результатов обработчика? Это даже возможно?

Я заканчиваю на API, который я записал для приложения Django, использующего django-поршень. API может искать запросом или IP-адресом, которые являются Request или IPAddress экземпляры соответственно. Каждый запрос может иметь 1 или больше IPAddress связанный с ним.

Так, например, у меня есть вызов API, который покажет все IPAddress объекты, соответствующие состоянию действия "активных", "неактивных", или "все" (для любого). Request к которому каждый IPAddress экземпляр связан, доступно как IPAddress.request.

Проблема, которую я имею, является этим Request.inputter внешний ключ к User экземпляр человека, который настроил запрос. Когда мои результаты возвращаются из обработчика, я создал для этого вызова API, всех полей от User экземпляр отображен, включая 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', ) ) ) ) 

Я предполагаю, что неправильно понимаю или неправильно использую способ, которым полевые исключения сделаны в этом контексте, таким образом, любое просвещение по этой теме значительно ценится.

5
задан Vadim Kotov 18 October 2017 в 15:57
поделиться

2 ответа

Вы можете получить желаемый результат, указав нужные поля через выражение обработчика fields =.

Поля модели, поступающие от иностранных ключей, могут быть указаны следующим образом:

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

В вашем случае должно сработать следующее (некоторые из ваших полей оставлены для краткости):

fields = ('updated', 'expires', 'created', 
    ('request', ('incident', 'reason', ('inputter', ('username',)))))
3
ответ дан 14 December 2019 в 13:35
поделиться

Можете ли вы попробовать использовать include вместо exclude? Например.

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

Я не помню, писал ли я exclude , чтобы он был таким же универсальным, как include .

Кроме того, группа Google django-поршня - это то место, где мы обсуждаем большинство вещей. Возможно, вам удастся задать этот вопрос там.

3
ответ дан 14 December 2019 в 13:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: