如何脱水Django模型字段名?

时间:2015-11-06 09:50:15

标签: python django django-models tastypie

我有一个Django模型如下:

class History(models.Model):
    TYPE_CHOICES = (
        (1, 'CREATE'),
        (0, 'EDIT'),
        (2, 'DELETE'),
    )
    user = models.ForeignKey(User, related_name='+')
    cp = models.ForeignKey('cp', related_name="history")
    field_name = models.CharField(max_length=192, null=False)
    old_value = models.CharField(max_length=500, null=True, blank=True)
    new_value = models.CharField(max_length=500, null=True, blank=True)
    type = models.IntegerField(default=0, choices=TYPE_CHOICES)
    date_created = models.DateTimeField(auto_now_add=True)

和资源(tastypie),

class HistoryResource(ModelResource):
    Id = fields.IntegerField('cp__id', null=True)
    username = fields.CharField('user__username', null=True)
    type_name = fields.CharField(attribute='type_name', null=True)

    class Meta:
        queryset = History.objects.all()

        def dehydrate_field_name(self, bundle):
            if bundle.data['field_name'] == 'category_a':
                return bundle.data['field_name'] = 'function'

        fields = ['id', 'type_name', 'Id', 'username', 'field_name', 'old_value',
                  'new_value', 'type', 'date_created']
        allowed_methods = ['get']

在我的脱水中,如果field_name的值为category_a,我想将我的field_name值转换为functional。但它没有按预期工作。这里有什么问题?对于tastypie /资源来说是非常新的。

1 个答案:

答案 0 :(得分:1)

为了进行自定义脱水,您需要扩展dehydrate方法,这意味着您的方法应该被调用dehydrate或被dehydrate方法调用。

然后,在您的方法中,您应该返回整个包,而不仅仅是更改的键值对。

def dehydrate(self, bundle):
    if bundle.data['field_name'] == 'category_a':
        bundle.data['field_name'] = 'function'
    return bundle

请参阅tastypie docs http://django-tastypie.readthedocs.org/en/latest/resources.html?highlight=dehydrate#Resource.dehydrate