2012-09-15 12 views
6

Come posso combinare più risorse in TastyPie? Ho 3 modelli che mi piacerebbe combinare: utenti, profili e post.Combina risorse correlate con TastyPie

Idealmente mi piacerebbe che i profili fossero annidati all'interno dell'utente. Mi piacerebbe esporre sia l'utente che tutto il percorso del profilo da UserPostResource. Non sono sicuro di dove andare da qui.

class UserResource(ModelResource): 

    class Meta: 
     queryset = User.objects.all() 
     resource_name = 'user' 
     fields = ['username','id','date_joined'] 

     #Improper Auth 
     authorization = Authorization() 

class UserProfileResource(ModelResource): 

    class Meta: 
     queryset = UserProfile.objects.all() 
     resource_name = 'profile' 


class UserPostResource(ModelResource): 
    user = fields.ForeignKey(UserResource,'user', full=True) 


    class Meta: 
     queryset = UserPost.objects.all() 
     resource_name = 'userpost' 

     #Improper Auth 
     authorization = Authorization() 

Qui sono i miei modelli:

class UserProfile(models.Model): 

    user = models.OneToOneField(User) 

    website = models.CharField(max_length=50) 
    description = models.CharField(max_length=255) 
    full_name = models.CharField(max_length=50) 


class UserPost(models.Model): 
    user = models.ForeignKey(User) 

    datetime = models.DateTimeField(auto_now_add=True) 
    text = models.CharField(max_length=255, blank=True) 
    location = models.CharField(max_length=255, blank= True) 

risposta

10

campi Tastypie (quando la risorsa è un ModelResource) consentono il passaggio nel attribute kwarg, che a sua volta accetta regolare Django sintassi di ricerca nidificato.

Quindi, prima di tutto questo potrebbe essere utile:

# in UserProfile model (adding related_name) 
user = models.OneToOneField(User, related_name="profile") 

e data la suddetta variazione, il seguente:

from tastypie import fields 

class UserResource(ModelResource): 
    # ... 
    website = fields.CharField(attribute = 'profile__website') 
    description = fields.CharField(attribute = 'profile__description') 
    full_name = fields.CharField(attribute = 'profile__full_name') 
    # ... 

esporrà i dati dal UserProfile modello della UserResource.

Ora, se si desidera esporre un elenco di posizioni (provenienti da UserPost) all'interno dello UserResource, sarà necessario sostituire uno dei metodi Tastypie. Secondo la documentazione, un buon candidato sarebbe il metodo dehydrate().

Qualcosa del genere dovrebbe funzionare:

# in UserPost model (adding related_name) 
user = models.ForeignKey(User, related_name="posts") 

class UserResource(ModelResource): 
    # .... 
    def dehydrate(self, bundle): 
     posts = bundle.obj.posts.all() 
     bundle.data['locations'] = [post.location for post in posts] 
     return bundle 
    # ... 
+0

ProfiloUtente è legato alla utente e UserPost è legato alla User, potrebbe fornire un esempio in questo caso? – arooo

+1

Se è possibile incollare i modelli e indicare quali attributi del modello si desidera esporre tramite 'UserResource', allora sì. – kgr

+0

Ho aggiornato la mia domanda – arooo