Как предоставить свойство (виртуальное поле) в модели Django как поле в TastyPie ModelResource - PullRequest
27 голосов
/ 31 января 2012

У меня есть свойство в модели 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']

Однако все, что я сейчас получаю, - это:

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

Я пытался поиграть со свойством fields в ModelResource, но это не помогло.Хотелось бы понять, что здесь происходит.

Ответы [ 2 ]

34 голосов
/ 31 января 2012

Вы должны иметь возможность определить его как поле 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

Вы также должны включить: set readonly=True на вашем CharField, или TastyPie попытается установить его значение при вставке или обновлении.

3 голосов
/ 22 февраля 2013

Полный пример с дегидратом:

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)
...