2013-10-07 8 views
0

Supposons que j'ai une ressource comme ci-dessous ..Comment retourner un seul champ dans tastypie?

class PostResource(ModelResource): 

    children = fields.ToManyField('MyApp.api.resources.PostResource', 
       attribute='comments', full=True, null=True) 

Fondamentalement, je veux revenir que ce domaine pour les enfants et l'aplatir.

Il ressemblera
[ {child-1-data}, {child-2-data} ]
plutôt que { children: [ {child-1-data}, {child2-data} ] }

Comment puis-je faire cela? En outre, si je veux une représentation différente de la même classe de modèle, devrais-je créer une nouvelle classe de ressource en tant que ci-dessous?

class PostNormalResource(ModelResource): 
     class Meta: 
      queryset= models.Post.objects.all() 
      fields = ['text', 'author'] 

Répondre

0

Pas vraiment la réponse que vous recherchez mais quelques découvertes que j'ai faites en creusant.

Normalement, vous devez modifier les données du lot en dehydrate. Voir le tastypie cookbook.

def dehydrate(self, bundle): 
    bundle.data['custom field'] = "This is some additional text on the resource" 
    return bundle 

Cela suggérerait que vous pourriez manipuler vos données faisceau d » de PostResource le long des lignes de:

def dehydrate(self, bundle): 
    # Replace all data with a list of children 
    bundle.data = bundle.data['children'] 
    return bundle 

Toutefois, cela l'erreur, AttributeError: 'list' object has no attribute 'items', comme le sérialiseur tastypie cherche à sérialiser un dictionnaire pas liste.

# "site-packages/tastypie/serializers.py", line 239 
return dict((key, self.to_simple(val, options)) for (key, val) in data.data.items()) 

# .items() being for dicts 

Cela suggère que vous devez examiner différents sérialiseurs. (Ou tout simplement se référer à post['children'] lors du traitement de votre JSON :-)

espoir qui aide à vous mettre dans la bonne direction


Et d'autre part, oui, si vous voulez une représentation différente du même modèle, puis utiliser un deuxième ModelResource. Évidemment, vous pouvez sous-classer pour essayer d'éviter la duplication.

0

Vous pouvez essayer de remplacer la méthode alter_detail_data_to_serialize. Il est appelé juste après que l'objet entier a été déshydraté, de sorte que vous pouvez faire des modifications sur le dictionnaire résultant avant qu'il ne soit sérialisé.

class PostResource(ModelResource): 
    children = fields.ToManyField('MyApp.api.resources.PostResource', 
      attribute='comments', full=True, null=True) 

    def alter_detail_data_to_serialize(self, request, data): 
     return data.get('children', []) 

Comme pour une représentation différente du même modèle - oui. Fondamentalement, vous ne devriez pas faire de nombreuses représentations car cela conduirait à l'ambiguïté et serait difficile à maintenir.

Questions connexes