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)
Related videos on Youtube
Comments
-
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 about 11 yearsdon't miss the 'u' :return u"%s %s" % (self.user.first_name, self.user.last_name)
-
-
anacarolinats about 11 yearsthere is a way to order by this field?