首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Tastypie中序列化django-mptt树

在Tastypie中序列化django-mptt树
EN

Stack Overflow用户
提问于 2013-03-08 09:52:15
回答 2查看 1.1K关注 0票数 4

如何在Tastypie中序列化django-mptt

我想使用django-mpttcache_tree_children()。我尝试过在不同的Tastypie钩子中应用,但它抛出了一个错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-10 07:39:56

代码语言:javascript
复制
class MenuResource(ModelResource):

    children = fields.ToManyField('self', 'children', null=True, full=True)
    parent = fields.ToOneField('self', 'parent', null=True)

    class Meta:
        queryset = Menu.objects.all()

要实现cache_tree_children函数,您可以编写自己的ToManyField子类来覆盖标准的dehydrate函数。请注意,我只是非常肤浅地测试了这个解决方案:

代码语言:javascript
复制
def dehydrate(self, bundle):
    if not bundle.obj or not bundle.obj.pk:
    if not self.null:
        raise ApiFieldError("The model '%r' does not have a primary key and can not be used in a ToMany context." % bundle.obj)

        return []

    the_m2ms = None
    previous_obj = bundle.obj
    attr = self.attribute

    if isinstance(self.attribute, basestring):
        attrs = self.attribute.split('__')
        the_m2ms = bundle.obj

        for attr in attrs:
            previous_obj = the_m2ms
            try:
                the_m2ms = getattr(the_m2ms, attr, None)
            except ObjectDoesNotExist:
                the_m2ms = None

            if not the_m2ms:
                break

    elif callable(self.attribute):
        the_m2ms = self.attribute(bundle)

    if not the_m2ms:
        if not self.null:
            raise ApiFieldError("The model '%r' has an empty attribute '%s' and doesn't allow a null value." % (previous_obj, attr))

        return []

    self.m2m_resources = []
    m2m_dehydrated = []

    # There goes your ``cache_tree_children``
    for m2m in cache_tree_children(the_m2ms.all()):
        m2m_resource = self.get_related_resource(m2m)
        m2m_bundle = Bundle(obj=m2m, request=bundle.request)
        self.m2m_resources.append(m2m_resource)
        m2m_dehydrated.append(self.dehydrate_related(m2m_bundle, m2m_resource))

    return m2m_dehydrated

也就是说,基于字段。我觉得这很酷。

票数 6
EN

Stack Overflow用户

发布于 2013-03-08 09:52:15

我是这样解决这个问题的:

代码语言:javascript
复制
class MenuResource(ModelResource):
    parent = fields.ForeignKey('self', 'parent', null=True)

    class Meta:
        serializer = PrettyJSONSerializer()
        queryset = Menu.objects.all().select_related('parent')
        include_resource_uri = False
        fields = ['name']

    def get_child_data(self, obj):
        data =  {
            'id': obj.id,
            'name': obj.name,
        }
        if not obj.is_leaf_node():
            data['children'] = [self.get_child_data(child) \
                                for child in obj.get_children()]
        return data

    def get_list(self, request, **kwargs):

        base_bundle = self.build_bundle(request=request)
        objects = self.obj_get_list(bundle=base_bundle, 
                                    **self.remove_api_resource_names(kwargs))
        sorted_objects = self.apply_sorting(objects, options=request.GET)

        paginator = self._meta.paginator_class(
            request.GET, sorted_objects, 
            resource_uri=self.get_resource_uri(), limit=self._meta.limit, 
            max_limit=self._meta.max_limit, 
            collection_name=self._meta.collection_name
        )
        to_be_serialized = paginator.page()

        from mptt.templatetags.mptt_tags import cache_tree_children
        objects = cache_tree_children(objects)

        bundles = []

        for obj in objects:
            data = self.get_child_data(obj)
            bundle = self.build_bundle(data=data, obj=obj, request=request)
            bundles.append(self.full_dehydrate(bundle))

        to_be_serialized[self._meta.collection_name] = bundles
        to_be_serialized = self.alter_list_data_to_serialize(request, 
                                                            to_be_serialized)
        return self.create_response(request, to_be_serialized)

如果你没有使用分页,你可以去掉这一部分。我就是这么做的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15285371

复制
相关文章

相似问题

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