2012-06-01 1 views
3

Я пытаюсь получить ответ tastypie для использования в другом представлении. Я видел the recipe in the cookbook. Проблема в том, что я хотел бы получить представление списка. В моем случае /api/v1/source/. Вот что у меня есть до сих пор:Получить список объектов в tastypie (в другом представлении)

sr = SourceResource() 
objs = sr.get_object_list(request) # two objects returned 
bun = sr.build_bundle(data=objs, request=request) 

jsondata = sr.serialize(None, sr.full_dehydrate(bun), 'application/json') 

Конечно, все это разваливается. bun.data не имеет требуемых характеристик (один объект). Итак, кто-нибудь сделал это успешно? Как это делается?

+0

Просто посмотреть на код tastypie в 'ModelResource'. Существует уже четко определенный путь кода для сериализации, гидратации/обезвоживания и десериализации для обоих списков и отдельных объектов. Если я правильно помню, есть вспомогательные функции, которые строят списки пакетов. – astevanovic

+0

Да, полный мозг пердеть с моей стороны, чтобы не смотреть на источник. Я считаю, что вы имеете в виду [это] (https://github.com/toastdriven/django-tastypie/blob/master/tastypie/resources.py#L1051). Я приму ваш ответ, если вы опубликуете его. –

+0

Нет, вы должны опубликовать свой собственный ответ, как только вы выясните, как именно это сделать, чтобы другие могли воспользоваться. Ура! – astevanovic

ответ

5

Вот что я придумал. Мне не очень нравится, что и запрос, и QueryDict копируются, но я не могу думать ни о чем другом в данный момент, кроме копирования больших частей the tastypie code.

from copy import copy 

from django.views.generic import TemplateView 

from incremental.sources.resources import SourceResource 
resource = SourceResource() 

class AppView(TemplateView): 
    'Base view for the Source parts of the app' 
    template_name = 'sources/base.html' 

    def get_context_data(self, **data): 
     'get context data' 
     tmp_r = copy(self.request) 
     tmp_r.GET = tmp_r.GET.copy() 
     tmp_r.GET['format'] = 'json' 

     data.update({ 
      'seed': resource.get_list(tmp_r).content 
     }) 
     return data 
+0

Это отличное решение. Я боролся с ошибками атрибутов, используя get_obj_list и full_dehydrate в течение нескольких часов, прежде чем спотыкаться об этом. Благодаря! – jonathanatx

3

Для того, чтобы избежать запроса копирования материала, вы можете установить JSON в качестве формата по умолчанию, например, в вашем ресурсе вы можете перегрузить следующий метод:

SourceResource(Resource): 
    def determine_format(self, request): 
    return "application/json" 

 Смежные вопросы

  • Нет связанных вопросов^_^