1

我正在使用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。目前我正在维护一个累积评分,我知道如何覆盖评分,但不确定如何在插入之前修改数据,以便下一步值比前一个值大 1。

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

4

2 回答 2

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()
于 2013-07-22T07:05:23.683 回答
0

在查看了更多资源后,我能够弄清楚我们如何使用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模型执行投票操作。

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在使用模型保存数据之前修改数据,我认为它比这更强大。请分享如果您认为有任何更好的解决方案可以实现相同的目标。

谢谢

于 2013-07-22T19:33:12.437 回答