2012-09-15 22 views
6

¿Cómo puedo combinar varios recursos en TastyPie? Tengo 3 modelos que me gustaría combinar: usuarios, perfiles y publicaciones.Combinar recursos relacionados con TastyPie

Idealmente me gustaría tener perfiles anidados dentro del usuario. Me gustaría exponer tanto al usuario como a toda la ubicación del perfil de UserPostResource. No estoy seguro de a dónde ir desde aquí.

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() 

Éstos son mis modelos:

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) 

Respuesta

10

campos Tastypie (cuando el recurso es un ModelResource) permiten que pasa en el attribute kwarg, que a su vez acepta la sintaxis de consulta anidada Django regular.

Así, en primer lugar, esto podría ser útil:

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

y dado el cambio anterior, lo siguiente:

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') 
    # ... 

expondrá los datos de UserProfile modelo dentro de la UserResource.

Ahora, si desea exponer una lista de ubicaciones (procedentes de UserPost) dentro del UserResource, deberá anular uno de los métodos Tastypie. De acuerdo con la documentación, un buen candidato sería el método dehydrate().

Algo como esto debería funcionar:

# 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

PerfilUsuario se relaciona con usuario y UserPost está relacionada con la del usuario, se puede proporcionar un ejemplo en este caso? – arooo

+1

Si pudiera pegar sus modelos y decir qué atributos de qué modelo desea exponer a través de 'UserResource', entonces sí. – kgr

+0

He actualizado mi pregunta – arooo

Cuestiones relacionadas