如何在Tastype的水合物循环中使用Django F()表达式?

2024-10-01 22:39:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个型号,上面有版本号。我希望它在新数据通过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

我想更有力地使用Django's F() expressions,例如:

^{pr2}$

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

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

有没有一种方法可以更有力地增加tastype的版本号?在

谢谢!在


Tags: 数据方法用户selfidtargetdataversion
2条回答

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

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

    super(MyModel, self).save(*args, **kwargs)

这个问题已经在github here得到了回答,不过我自己还没有尝试过。引用该链接:

You're setting bundle.data inside a hydrate method. Usually you modify bundle.obj in hydrate methods and bundle.data in dehydrate methods.

Also, those F objects are meant to be applied to Django model fields.

I think what you want is:

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

相关问题 更多 >

    热门问题