Lotan

作者: RoyTien | 来源:发表于2018-01-09 16:54 被阅读5次
    from lotan import Lotan
    from lotan.models import Model, IntField, StringField
    
    # Define models
    class Question(models.Model):
    
        id = models.IntField(is_key=True)
        title = models.StringField()
        member_id = models.IntField()
    
        def resolve_by_id(self):
            return {
                'title': 'This is title string',
                'member_id': 1,
            }
    
    q = Question(id=1)
    
    assert q.title == 'This is title string'
    assert q.member_id == 1
    

    Fields are mostly lazy loaded and resolved by resolve funcitons.

    Note that not every non-key-field need a corresponding resolve funciton. the result returned by resolve_by_ functions will be automatically applied to model's fields, which means if the resolve_by_id function in the above example return a dict which contains gender data, the gender field of the Member instance will be set to it automatically event if there is no funciton named resolve_gender.

    test_member.py
    def test_init_by_id(self, rpc_member):
            rpc_member.get_member.return_value = FAKE_MEMBER
            member = Member(id=FAKE_MEMBER.id)
            self.assertEqual(member.id, FAKE_MEMBER.id)
            self.assertEqual(member.fullname, FAKE_MEMBER.fullname)
            rpc_member.get_member.assert_called_once_with(member_id=FAKE_MEMBER.id)
    

    Lotan

    base.py

    __init__(self, **kwargs) 接收到了 kwargs = {'id' : 1} , 使用 _extract_seed_key(kwargs)'id' 另存为 seed_key;

    1. __eq__() calls run_key_resolver()
    1. run_key_resolver() runs the key resolver

      • update _exist_state 的值 RAN_EXIST;
      • 得到有关于 key (id) 的 resolver, seed_key_resolver = self.get_key_resolver(self.seed_key)
        seed_key_resolver = getattr(self, 'resolve_by_%s' % key_name, None)
      • 通过 query.py中的 ResolverManager 运行 resolve_by_key
      returned_key_result = self.resolver_manager.retrieve_field(
              key_name=self.seed_key,
              key_value=self.seed_value,
              field_name=self.seed_key,
              field_resolver=seed_key_resolver,
              session=self.session
      )
      
      • dispatch_key_result()
      • set_field_value()
    2. retrieve_field() calls run_resolver(field_resolver)

      • 获取函数对象的arg。
        return self.run_resolver(
                  field_resolver,
                  *resolver_args,
                  session=session
        )
      
      • run_resolver() : All resolver should call this to solve the problem.

    相关文章

      网友评论

          本文标题:Lotan

          本文链接:https://www.haomeiwen.com/subject/xvcgnxtx.html