How to expose a property (virtual field) on a Django Model as a field in a TastyPie ModelResource

12,758

Solution 1

You should be able to define it as a field try:

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

Edit

You also have to include: set readonly=True on your CharField, or TastyPie will try to set its value on insertion or update.

Solution 2

A full example with dehydrate:

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)
Share:
12,758

Related videos on Youtube

Danish Munir
Author by

Danish Munir

Just a regular geek

Updated on February 23, 2020

Comments

  • Danish Munir
    Danish Munir about 4 years

    I have a property in a Django Model that I'd like to expose via a TastyPie ModelResource.

    My Model is

    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)
    

    My ModelResource is

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

    However all I'm currently getting out of the tastypie api is:

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

    I have tried playing with the fields property in the ModelResource, but that hasn't helped. Would love to understand what is going on here.

    • dzen
      dzen about 11 years
      don't miss the 'u' :return u"%s %s" % (self.user.first_name, self.user.last_name)
  • anacarolinats
    anacarolinats about 11 years
    there is a way to order by this field?