在保存Django-tastypie之前修改数据

时间:2013-07-21 09:13:49

标签: django rest django-models tastypie

我正在使用Django-Tastypie为我的Django模型创建REST API。我的测试用户模型中包含以下字段。

user_id       models.AutoField(primary_key=True)
user_name     models.CharField(max_length=200, db_index=True)
user_rating   models.IntegerField(default=0)

在这里,我想根据要求编写一个API,每次增加用户的评级为1.目前我维持累积评级,我知道如何覆盖评级但不确定如何在插入之前修改数据所以Next值比前一个值多1个。

我已经浏览了Django-Tasypie文档以检查是否有任何直接解决方案并尝试prepend_url修改请求但不确定我们如何获取当前评级并更新它。

2 个答案:

答案 0 :(得分:0)

行。 您的意思是,如果更新resource1,则更新用户资源的“user_rating”字段。 您可以覆盖与resource1关联的model1的django模型保存方法。

    class Model1(models.Model):
        user = models.ForeignKey('User')
        id = models.BigIntegerField()
        name = models.CharField(max_length=255L)
        class Meta:
            db_table = 'table1'
        def save(self, *args, **kwargs):
            super(Model1, self).save(*args, **kwargs)
            self.user.user_rating += 1
            self.user.save()

答案 1 :(得分:0)

在研究了几个resources后,我能够弄清楚如何使用prepend_url来解决这个问题。所以,我只是想写一些对我有用的东西,并希望它对其他人也有用。

这就是UserResource的样子。

class UserResource(ModelResource):
    class Meta:
        queryset = User.objects.all()
        resource_name = 'user'

    def prepend_urls(self):
        Return [
            url(r"^(?P<resource_name>%s)/(?P<user_id>\w[\w/-]*)/upvote%s$" %
                (Self. _meta. resource_name, trailing_slash ()),
                self.wrap_view('upvote_user'), name="api_user_upvote"),
        ]

    def upvote_user(self, request, **kwargs):
        self.method_check(request, allowed=['get'])
        self.is_authenticated(request)
        self.throttle_check(request)

        try:
            basic_bundle = self.build_bundle(request=request)
            obj = self.cached_obj_get(bundle=basic_bundle,
                                      **self.remove_api_resource_names(kwargs))
        except ObjectDoesNotExist:
            return HttpGone()
        except MultipleObjectsReturned:
            return HttpMultipleChoices("More than one resource is found at this URI.")

        user_manager_obj = UserManager()
        return self.create_response(request, user_manager_obj.upvote_user(obj.user_id))

并在我的UserManager课程中再写了一个方法,以便对User模型执行upvote操作。

def upvote_user(self, user_id):
    try:
        user = User.objects.get(id=user_id)
        user.user_rating += 1
        user.save()
    except:
        # Handle Exception
        return False

    return True

这显示了在使用模型保存数据之前我们如何使用prepend_url修改数据,我认为它比这更强大。请分享如果您认为有更好的解决方案可以达到目的。

由于