Commit 78c94853 authored by gushitong's avatar gushitong

py3 support

parent 8bfcc1b0
......@@ -36,8 +36,8 @@ class CacheAccessor(RPCMixin):
get list object from cache.
:return:
"""
values = filter(lambda i: i is not None, [self.cache[pk] for pk in set(self.pk_list)])
if len(values) == len(set(self.pk_list)):
values = list(filter(lambda i: i is not None, [self.cache[pk] for pk in set(self.pk_list)]))
if len(values) == len(self.pk_list):
return values
return []
......
from django.db import models
from gm_serializer import fields, serializers
class UserManager(object):
def __init__(self):
self.url = 'api/user/get'
def __call__(self, pk_list):
# mock return user instance from rpc call.
return [{'id': pk, 'username': "username %s" % pk} for pk in pk_list]
class Post(models.Model):
"""
This is demonstrate app model.
To explain how to use gm-serializer in your project.
`weak_rel` is more like a cross-database foreign-key relation.
"""
user = fields.MagicField(type=int, manager=UserManager, ttl=60*60)
title = models.CharField(max_length=128)
content = models.CharField(max_length=255)
create_at = models.DateTimeField(auto_now_add=True)
update_at = models.DateTimeField(auto_now=True)
class PostSerializer(serializers.GmModelSerializer):
user = serializers.MagicField()
class Meta:
model = Post
lazy_fields = ('user',)
fields = ('user', 'title', 'content', 'create_at')
......@@ -6,7 +6,7 @@ from rest_framework import serializers
class MagicField(serializers.Field):
def to_representation(self, value):
return json.loads(json.dumps(value))
return value if isinstance(value, (int, str)) else value.copy()
def to_internal_value(self, data):
return data
......@@ -99,7 +99,8 @@ class GmListSerializer(ListSerializer):
def zip_iterable(cls, field, iterable, futures):
for i in range(len(iterable)):
lazy_id = getattr(iterable[i], "%s_id" % field)
future = filter(lambda item: item['id'] == lazy_id, futures)
future = list(filter(lambda item: item['id'] == lazy_id, futures))
if len(future) > 1:
raise MultiLazyObjFound
elif len(future) == 1:
......
from django.test import TestCase
from .models import Post, PostSerializer
class MagicFieldTestCase(TestCase):
def setUp(self):
for i in range(10):
Post.objects.create(user=i, title="article %s" % i, content="body %s" % i)
def test_get_object(self):
post = Post.objects.first()
self.assertEqual(post.user, {'id': 0, 'username': 'username 0'})
def test_get_queryset(self):
"""
pass
:return:
"""
posts = Post.objects.all()[:10]
serializer = PostSerializer(posts, many=True)
for idx, obj in enumerate(serializer.data):
self.assertEqual(obj['user'], {'id': idx, 'username': 'username %s' % idx})
def test_get_queryset_lazy(self):
posts = Post.objects.all()[:10]
serializer = PostSerializer(posts, many=True, lazy=True)
for idx, obj in enumerate(serializer.data):
self.assertEqual(obj['user'], idx)
......@@ -14,7 +14,7 @@ class DictWrapper(dict):
if isinstance(self[item], dict):
return DictWrapper(self[item])
return self[item]
raise AttributeError
return super(DictWrapper, self).__getattribute__(item)
class RPCMixin(object):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment