Собственно, столкнулся с проблемой в процессе разработки для REST интерфейса к кортежам, которые очень удобно использовать для создания мелких справочников типа Пол(муж,жен), Тип(хороший,плохой)
BREEDTYPE = (
(u'%s' % FORMPTYPE_HYBRID,u'гибирд'),
(u'%s' % FORMPTYPE_CLONE,u'клон'),
(u'%s' % FORMPTYPE_SORT,u'сорт'),
(u'%s' % FORMPTYPE_SCREENED,u'отбор'),
(u'%s' % FORMPTYPE_ELITE,u'элита'),
)
class Breed(models.Model):
name = models.CharField(u'наименование', max_length=256)
created = models.DateField(u'создан',default=datetime.datetime.now())
breedtype = models.CharField(u'тип', max_length=3, choices = BREEDTYPE)
........
и.т.д. В документации к библиотечке tastypie есть шаблон для доступа к NoSQL (http://readthedocs.org/docs/django-tastypie/en/latest/non_orm_data_sources.html) , а также более качественный пример https://gist.github.com/794424 , немного доработав получился уже более удобный инструмент:
Глобальный ресурс : resources.py
from tastypie import fields
from tastypie.bundle import Bundle
from tastypie.exceptions import NotFound
from tastypie.resources import Resource
from tastypie.resources import ModelResource, Resource
class DictResourceObject(object):
id = None
key = ''
name = ''
def __init__(self, id=None, key=None, name=None):
self.id = id
self.key = key
self.name = name
class DictResource(Resource):
id = fields.IntegerField(attribute = 'id')
key = fields.CharField(attribute = 'key')
name = fields.CharField(attribute = 'name')
class Meta:
object_class = DictResourceObject
allowed_methods = ['get']
@classmethod
def prepdata(self,tupl):
dd = []
i = 0
for k,v in tupl:
i +=1
dd.append([i,DictResourceObject(i,k,v)])
return dict(list(dd))
def get_resource_uri(self, bundle_or_obj):
kwargs = {
'resource_name': self._meta.resource_name,
}
if isinstance(bundle_or_obj, Bundle):
kwargs['pk'] = bundle_or_obj.obj.id # pk is referenced in ModelResource
else:
kwargs['pk'] = bundle_or_obj.id
if self._meta.api_name is not None:
kwargs['api_name'] = self._meta.api_name
return self._build_reverse_url('api_dispatch_detail', kwargs = kwargs)
def get_object_list(self, request):
return self._meta.object_data.values()
def obj_get_list(self, request = None, **kwargs):
return self.get_object_list(request)
def obj_get(self, request = None, **kwargs):
pk = int(kwargs['pk'])
try:
return self._meta.object_data[pk]
except KeyError:
raise NotFound("Object not found")
Локальный для каждого приложения resources.py:
from tastypie.authorization import DjangoAuthorization
from tastypie.api import Api
from tastypie.resources import ModelResource
from tastypie.resources import Resource
from apps.rest.resources import DictResource
from apps.breeds.models import BREEDTYPE
class BreedTypeResource(DictResource):
class Meta:
resource_name = 'breedtype'
object_data = DictResource.prepdata(BREEDTYPE)
authorization = DjangoAuthorization()
api = Api(api_name='breeds')
api.register(BreedTypeResource())
Собственно все, дополняйте!
Updated 14 Aug. 2011, 2:12 by elston.