0

我有一个带有版本号的模型。id当新数据通过 TastyPie与现有数据一起发布时,我希望它自增。我目前正在通过 hydrate 方法执行此操作,只要两个用户不尝试一次更新即可:

class MyResource(ModelResource):
    ...
    def hydrate_version(self, bundle):
        if 'id' in bundle.data:
            target = self._meta.queryset.get(id=int(bundle.data['id']))
            bundle.data['version'] = target.version+1
        return bundle

我想通过使用Django 的 F() 表达式来更稳健地做到这一点,例如:

    def hydrate_version(self, bundle):
        if 'id' in bundle.data:
            from django.db.models import F
            target = self._meta.queryset.get(id=int(bundle.data['id']))
            bundle.data['version'] = F('version')+1
        return bundle

但是,这给了我一个错误:

TypeError: int() argument must be a string or a number, not 'ExpressionNode'

有没有办法用 TastyPie 更稳健地增加版本号?

谢谢!

4

2 回答 2

1

我会为您的 Django 模型覆盖 save() 方法,并在那里执行更新。这具有确保相同行为的额外优势,无论从来自美味派或来自 django/python shell 的更新。

def save(self, *args, **kwargs):
    self.version = F('version') + 1

    super(MyModel, self).save(*args, **kwargs)
于 2013-08-09T14:17:21.017 回答
0

尽管我自己还没有尝试过,但这已在github上得到了回答。引用该链接:

您在 hydrate 方法中设置 bundle.data 。通常你修改 hydrate 方法中的 bundle.obj 和 dehydrate 方法中的 bundle.data。

此外,这些 F 对象旨在应用于 Django 模型字段。

我想你想要的是:

def hydrate_version(self, bundle):
    if bundle.obj.id is not None:
        from django.db.models import F
        bundle.obj.version = F('version')+1
    return bundle
于 2014-03-11T22:05:36.890 回答