【问题标题】:Django action (not model data directly) HTML view and API validation keeping a DRY ruleDjango 操作(不是直接模型数据) HTML 视图和 API 验证保持 DRY 规则
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2010-11-08
      • 1970-01-01
      • 2011-06-06
      • 2011-05-21
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多