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

Danish Munir picture Danish Munir · Jan 31, 2012 · Viewed 11.4k times · Source

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.

Answer

JamesO picture JamesO · Jan 31, 2012

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.