【问题标题】:How can I limit fields in ToManyField with full=True in django-tastypie如何在 django-tastypie 中使用 full=True 限制 ToManyField 中的字段
【发布时间】:2011-12-07 19:57:18
【问题描述】:

我有以下资源:

class MachineResource(ModelResource):
manager = fields.ToOneField(UserResource, 'manager',full=True)
class Meta:
    queryset = Service.objects.filter(service_type='machine')
    resource_name = 'machine'

这很好用。并将返回一个机器列表,以及每个机器中的嵌入式用户对象(管理器)。

但是,我只需要经理用户的 2-3 个字段。例如,我不希望它包含经理加盐通行证和其他私人数据。

据我所知,没有办法可以轻松做到这一点吗?

【问题讨论】:

    标签: django api tastypie


    【解决方案1】:

    我个人觉得为同一个 Model 类创建两个 ModelResources 的想法有点不雅。例如,假设您想在UserResource 的详细视图中显示电子邮件字段,但不想在作为MachineResource 的一部分显示为完整对象时显示。我解决问题的方法是在dehydrate 方法中删除嵌入对象的数据字典中的非必需字段的键。也许有点hacky方式,但对我来说很好。对于您的情况,您可以这样做:

    class MachineResource(ModelResource):
        manager = fields.ToOneField(UserResource, 'manager',full=True)
    
        class Meta:
            queryset = Service.objects.filter(service_type='machine')
            resource_name = 'machine'
    
        def dehydrate(self,bundle):
            del bundle.data['manager'].data['email']
            return bundle
    

    【讨论】:

      【解决方案2】:

      看看Quick Start section for django-tastypie。那里有一个完美的例子。当您为User(您的“经理”)定义您的ModelResource 子类时,只需将带有exclude 属性集的Meta 类添加到您不想显示的字段列表中。

      class UserResource(ModelResource):
          class Meta:
              queryset = User.objects.all()
              resource_name = 'auth/user'
              excludes = ['email', 'password', 'is_superuser']
      

      【讨论】:

      • 啊,这很有道理。这确实意味着我需要创建一个单独的 UserResource ,特别是为了嵌入到 MachineResource 中(我已经有一个标准的 UserResource 类用于一般用途,它排除了我想要在 MachineResource 类中排除的不同字段)。
      • 这是我宁愿避免的事情,因为我不希望某个 URL 可以访问 UserResource 的冗余变体。我想我可以以某种方式删除它的 URL...?
      • Resources 不会自动获取 URL。您必须将它们连接到您的urls.py。特别是如果你在做full=True,它甚至不需要它自己的 URL。
      • 啊。我最初的印象是除非在 urls.py 中注册,否则资源将无法工作。现在我想起来,这是一件非常愚蠢的事情。谢谢,你帮了大忙:)。
      猜你喜欢
      • 1970-01-01
      • 2014-03-21
      • 2013-01-03
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      • 2012-03-05
      • 2012-07-09
      • 1970-01-01
      相关资源
      最近更新 更多