Python 如何在tastype';中使用Django F()表达式;水合物循环?

Python 如何在tastype';中使用Django F()表达式;水合物循环?,python,django,tastypie,race-condition,Python,Django,Tastypie,Race Condition,我有一个型号,里面有版本号。我希望在通过tastype发布带有现有id的新数据时,它能够自我增值。我目前正在通过水合物方法进行此操作,只要两个用户不尝试同时更新,该方法就会起作用: class MyResource(ModelResource): ... def hydrate_version(self, bundle): if 'id' in bundle.data: target = self._meta.queryset.get(id

我有一个型号,里面有版本号。我希望在通过tastype发布带有现有
id
的新数据时,它能够自我增值。我目前正在通过水合物方法进行此操作,只要两个用户不尝试同时更新,该方法就会起作用:

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
我希望通过使用,例如:

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

TypeError: int() argument must be a string or a number, not 'ExpressionNode'
有没有一种方法可以更有力地增加tastype的版本号

谢谢

我将替代Django模型的save()方法,并在那里执行更新。这样做的另一个好处是,无论是从tastype还是从django/pythonshell更新,都可以确保相同的行为

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

    super(MyModel, self).save(*args, **kwargs)
虽然我自己还没有试过,但这个问题已经得到了回答。引用该链接:

您正在水合物方法中设置bundle.data。通常在水合物方法中修改bundle.obj,在脱水方法中修改bundle.data

此外,这些F对象还将应用于Django模型字段

我想你想要的是:


谢谢-听起来很合理。奇怪的是,当我实现这一点时,每当我保存模型实例时,我在单元测试(从
tastypie.test
ResourceTestCase
子类)中都会遇到相同的错误。但是,当我进入python shell并保存一个实例时,一切正常。单元测试和F()表达式有问题吗?我已经进一步研究了这个问题:首先,在上面的
save
方法中,如果self.pk不是None:,我需要添加
,以便在新实例上不使用
F()
表达式。其次,我编写了一个单元测试,它使用
my_model.save()
直接保存实例,效果很好。但是,通过API更新模型的unittest继续在tastype
fields.py
脱水方法中给我一个错误。我怀疑问题在于,在TastyPie试图返回的实例中,F()表达式仍然未赋值;我需要在保存后以某种方式强制TastyPie重新获取实例。
def save(self, *args, **kwargs):
    self.version = F('version') + 1

    super(MyModel, self).save(*args, **kwargs)
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