【发布时间】:2014-12-22 19:19:51
【问题描述】:
我想为我的项目创建一个 API。
模型:
class Offer(models.Model):
user = models.ForeignKey(User)
data = models.TextField()
class Bid(models.Model):
user = models.ForeignKey()
offer = models.ForeignKey()
created_at = models.DateTimeField(auto_now_add=True)
这是简化的示例(因为有更多检查) 出价和出价用户都可以取消出价。
在我的标准 (HTML) 视图中:
def cancel_bid(request, pk):
do_some checks_if request.user_is_either_Bid_or+Offer)creator()
check_if_Bid_has_been_created_for_less_than_5_minutes()
#as user can cancel his bid within 5 minutes
现在必须将同样的方法应用于 Django Rest Framework(权限或序列化程序)。
问题是我需要返回显示在 json 错误响应(使用 api 时)和我的 HTML 视图中的错误消息和代码。
我在我的 Bid 模型中创建了一个 cancel(self, user, other kwargs) 来执行这些检查并返回我的自定义 PermissionDenied(message, code)。然后在 DRF 和我的观点中,我简单地说:
bid = Bid.objects.get(pk=pk)
try:
bid.cancel(user):
except PermissionDenied as e:
messages.error(request, e.message)
# or return HttpResponseForbidden(e.message)
在django rest框架中:
class OrderCancelView(APIView):
def post(self, request, pk):
try:
order.cancel(request.user)
except PermissionDenied as e:
raise serializers.PermissionDenied(detail=e.message)
在我的 clean() 方法中执行了更多操作,这里没有指出.. 使方法非常复杂。 例如: 如果报价到期,除了第一个(最早的)之外的所有投标都被取消..所以没有用户, 因为它是由系统制作的。然后我必须省略用户检查..等等。
您对此有何看法?进行这种“动作”验证并保持 DRY 规则的最佳 Django 方式是什么?
【问题讨论】:
标签: django django-rest-framework