如何将Django模型中的属性(虚拟字段)暴露为TastyPie ModelResource中的字段

28

我有一个 Django 模型中的属性,我希望通过 TastyPie ModelResource 公开它。

我的模型是:

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)

我的 ModelResource 是:

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

但是我目前从tastypie api获取到的是:

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

我尝试过在ModelResource中使用fields属性,但并没有帮助。希望能理解这里发生了什么。


返回翻译文本:不要漏掉'u' :return u"%s %s" % (self.user.first_name, self.user.last_name) - dzen
2个回答

35

你可以将其定义为字段,尝试一下:

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

编辑

你还需要在 CharField 上加上 set readonly=True,否则 TastyPie 在插入或更新时会尝试设置它的值。


3
有没有一种按照这个字段排序的方法? - anacarolinats

3

使用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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接