首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现Django风格的API,链接点,继承

实现Django风格的API,链接点,继承
EN

Stack Overflow用户
提问于 2017-01-06 05:55:29
回答 1查看 89关注 0票数 2

我正在尝试为JSON实现客户机。我与Django一起工作,我发现它处理查询的方式非常有趣。

例如:

代码语言:javascript
复制
>>> from django.contrib.auth.models import User
>>> user = User.objects.get(username='johndoe')
>>> user
<User: johndoe>
>>> user.objects.get(username='johndoe')
AttributeError: Manager isn't accessible via User instances

我感兴趣的是Manager到底是什么,以及是否有一种简单的实现方法。我试图做一些类似的事情,但不幸地失败了。这是我的第一次尝试:

代码语言:javascript
复制
class Api(object):
    def __init__(self, api_key):
        self.api_key = key

    @property
    def player(self):
        return Player(api=self)

class Player(object):
    def __init__(self, api):
        self.api = api

    def get(self, id_):
        '''
        gets json and turns it into dictionary
        '''
        self.name = data['name']
        self.id_ = id_

        return self

所以用法应该如下所示:

代码语言:javascript
复制
>>> api = Api('api_key_here')
>>> player = api.player.get('player_id_here')

然而,对我来说,这样做感觉很粗略,而且是错误的(这当然是正确的)。这里的问题是:

  1. 我必须把整个Api对象发送到播放器对象
  2. Player对象仍然具有get()方法。
  3. 我不知道这样使用@property是否可以接受

下面是我想如何使用我的Api类:

代码语言:javascript
复制
api = Api('api_key_here')
player = api.player.get('player_id') #getting player object
item = api.item.get('item_id') #getting item object
recent_games = api.recent_games.filter(player=player, how_many=10) #getting list of game objects
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-06 06:46:03

我建议您看看https://github.com/samgiles/slumber,它实现了您可能正在做的事情( Rest客户端)。但是即使你在做其他的事情,睡眠也是实现你想要做的事情。类似于:

代码语言:javascript
复制
class RestResource(object):

    def __init__(self, *args, **kwargs):
       self._store = kwargs

    def __call__(self, id=None, action=None):
       """
       Returns a new instance of self modified by one or more of the available
       parameters. These allows us to do things like override format for a
       specific request, and enables the api.resource(ID).get() syntax to get
       a specific resource by it's ID.
       """

       kwargs = {
          'foo': self._store['name1'],
          'bar': self._store['name2']
       }

       return self.__class__(**kwargs)

class Api(object):
   resource_class = RestResource

   def __getattr__(self, item):
      kwargs = {
        'name1': 'val1',
        'name2': 'val2'
      }

      return self.resource_class(**kwargs)

你可以这样用

代码语言:javascript
复制
api = Api()
api.player.get()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41499798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档