1

我有一个包含 first_name、last_name 和 email 字段的人员模型。我想将这些字段发送到将检查数据库中现有实例的视图。如果有,则返回 ID,如果没有,则创建新实例并返回新 ID。使用标准 FBV 我会这样做(缩减版本,减去验证等):

from django.http import HttpResponse
from mysite.models import Person
import json

def get_or_create_person(request):
    try:
        person = Person.objects.get(first_name=request.POST['first_name'],
            last_name=request.POST['last_name'], email=request.POST['email'])
    except Person.DoesNotExist:
        person = Person(first_name=request.POST['first_name'],
            last_name=request.POST['last_name'], email=request.POST['email'])
        person.save()

    response = {'id': person.id}
    return HttpResponse(json.dumps(response))

将其转换为使用 CBV 并将其与其余框架绑定是否有任何实际意义,如果是这样,我将如何去做?我想要它作为 CBV 的主要原因是我可以使用我已经包含在我的应用程序其他部分中的 mixins 等。

编辑:我考虑过使用通过其余框架可用的 ViewSet,但他们将此功能拆分为 GET 和 POST 方法,获取检索记录并发布更新或创建记录。我基本上需要一个可以接受的观点。

4

2 回答 2

1

我不得不将 get 和 post 函数组合起来,如下所示:

class GetOrCreateCustomerView(APIView):
    '''
    API endpoint that takes an email address, first name & surname and then
    either returns the matching customer id or creates a new customer and
    returns that id
    '''

    required_fields = ('first_name', 'last_name', 'email')

    def get(self, request, format=None):
        request_data = request.GET
        response = self.get_customer_id(request_data)

        return JSONResponse(response)

    def post(self, request, format=None):
        request_data = request.POST
        response = self.get_customer_id(request_data)

        return JSONResponse(response)

    def get_customer_id(self, data):
        kwargs = {}
        for f in self.required_fields:
            if f in data:
                kwargs[f] = data[f]
            else:
                return None

        try:
            customer = Customer.objects.get(**kwargs)
        except Customer.DoesNotExist:
            customer = Customer(**kwargs)
            customer.save()

        if customer.id is not None:
            response = {'customer_id': customer.id}
        else:
            response = {
                'error': 'Please provide a first name, surname and email address'
            }

        return response

此处引用的 JSONResponse 来自其余框架文档

于 2013-06-27T08:18:34.323 回答
0

对于 django-rest-framework 中基于类的视图,这通常通过以下方式完成:

  1. 对资源的 GET 请求将检索记录
  2. 对同一资源的 POST 请求将创建一条记录

我相信在 django rest 框架文档中有几个这样的例子

于 2013-06-18T16:31:42.003 回答