我正在使用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
修改请求但不确定我们如何获取当前评级并更新它。
答案 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
修改数据,我认为它比这更强大。请分享如果您认为有更好的解决方案可以达到目的。
由于