Django操作(不直接模型数据)HTML视图和API验证保持DRY规则

时间:2014-12-22 19:19:52

标签: django django-rest-framework

我想为我的项目创建一个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规则?

1 个答案:

答案 0 :(得分:0)

似乎您已经有了一个良好的开端,您只需要在模型上构建您的cancel方法,以便它具有执行业务逻辑所需的所有信息。如果您的逻辑必须在DRF和普通视图代码之间相同,那么我会将所有业务逻辑提取到模型中。您可能必须给它提供大量参数,以便它可以做出所有正确的决定,但这比必须重复两次逻辑要好。