2012-01-31 12 views
25

Tengo una propiedad en un modelo de Django que me gustaría exponer a través de un TastyPie ModelResource.Cómo exponer una propiedad (campo virtual) en un modelo de Django como un campo en un TastyPie ModelResource

Mi modelo es

class UserProfile(models.Model): 
    _genderChoices = ((u"M", u"Male"), (u"F", u"Female")) 

    user = Models.OneToOneField(User, editable=False) 
    gender = models.CharField(max_length=2, choices = _genderChoices) 

    def _get_full_name(self): 
     return "%s %s" % (self.user.first_name, self.user.last_name) 

    fullName = property(_get_full_name) 

Mi ModelResource se

class UserProfileResource(ModelResource): 
    class Meta: 
     queryset = models.UserProfile.objects.all() 
     authorization = DjangoAuthorization() 
     fields = ['gender', 'fullName'] 

Sin embargo todo momento, me voy de la API se tastypie:

{ 
    gender: 'female', 
    resource_uri: "/api/v1/userprofile/55/" 
} 

He intentado jugar con la propiedad fields en el ModelResource, pero eso no ha ayudado. Me encantaría entender lo que está pasando aquí.

+0

no se pierda la 'U': volver u "% s% s" % (self.user.first_name, self.user.last_name) – dzen

Respuesta

34

Usted debe ser capaz de definirlo como un field intento:

class UserProfileResource(ModelResource): 
    fullname = fields.CharField(attribute='_get_full_name', readonly=True) 
    class Meta: 
     queryset = models.UserProfile.objects.all() 
     authorization = DjangoAuthorization() 
     fields = ['gender',] 

Editar

Usted también tiene que incluir: set readonly=True en su CharField, o TastyPie va a tratar de establecer su valor en inserción o actualización.

+2

hay una forma de ordenar por este campo? – anacarolinats

3

un ejemplo completo con deshidratado:

class UserResource(ModelResource): 
    fullname = fields.CharField(readonly=True) 

    class Meta: 
     queryset = auth_models.User.objects.all() 
     resource_name = 'user' 

    def dehydrate_fullname(self, bundle): 
     return u"{first_name} {last_name}".format(
      first_name=bundle.obj.first_name, last_name=bundle.obj.last_name) 
Cuestiones relacionadas