我想为我的项目创建一个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模型中创建了一个取消(自我,用户,其他kwargs),其中检查了这些并且返回了我的自定义PermissionDenied(消息,代码)。然后在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 framework中:
class OrderCancelView(APIView):
def post(self, request, pk):
try:
order.cancel(request.user)
except PermissionDenied as e:
raise serializers.PermissionDenied(detail=e.message)
我的clean()方法中执行了更多操作,这里没有指出.. 使方法非常复杂。 例如: 如果优惠到期,则除了第一个(最早的)之外的所有出价都被取消..所以没有用户, 因为它是由系统制作的。我必须省略用户检查然后..等等。
您对此有何看法?什么是最好的Django方式来做这种"行动"验证和保持DRY规则?
答案 0 :(得分:0)
似乎您已经有了一个良好的开端,您只需要在模型上构建您的cancel
方法,以便它具有执行业务逻辑所需的所有信息。如果您的逻辑必须在DRF和普通视图代码之间相同,那么我会将所有业务逻辑提取到模型中。您可能必须给它提供大量参数,以便它可以做出所有正确的决定,但这比必须重复两次逻辑要好。