首页 > 解决方案 > AttributeError 'RegisterDetailView' 对象没有属性 'get_object'

问题描述

我正在尝试通过 curl 为现有记录提交 PATCH。

我想将我的布尔字段从 true 更改为 false。

主键不是默认 id,而是在我的 models.py 中定义的 CharField 我这样做是希望使 url 路径更易于操作;/api/register/序列号与 ID 号。

模型.py

from django.db import models

class Register(models.Model):
    system_type = models.CharField(max_length=255)
    serial_number = models.CharField(max_length=255, unique=True, primary_key=True)
    mac_address = models.CharField(max_length=17, unique=True)
    ip_address = models.CharField(max_length=15)
    request = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
            return self.serial_number

视图.py

class RegisterDetailView(APIView):
    serializer_class = serializers.RegisterSerializer
    def get(self, pk):
        return Register.objects.get(pk=pk)

    def patch(self, request, pk):
        registermodel_object = self.get_object(pk)
        serializer = serializers.RegisterSerializer(registermodel_object, data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        else:
            return Response(
                serializer.errors,
                status=status.HTTP_400_BAD_REQUEST
            )

网址.py

from django.urls import path, include, re_path
from register import views

urlpatterns = [
    re_path(r'^register/(?P<pk>\w+)/$', views.RegisterDetailView.as_view()),
]

卷曲命令

curl -d "system_type=switch&serial_number=SAL1834ZDSY&ip_address=f8c2.8887.d480&mac_address=172.16.24.11&request=false" -X PATCH http://192.168.1.100/api/register/SAL1834ZDSY/

当我使用补丁运行 curl 命令时,出现此错误:

AttributeError at /api/register/SAL1834ZDSY/
'RegisterDetailView' object has no attribute 'get_object'

Request Method: PATCH
Request URL: http://192.168.1.100/api/register/SAL1834ZDSY/
Django Version: 2.2.6
Python Executable: /usr/local/bin/uwsgi
Python Version: 3.6.8
Python Path: ['.', '', '/usr/lib64/python36.zip', '/usr/lib64/python3.6', '/usr/lib64/python3.6/lib-dynload', '/opt/django/lib64/python3.6/site-packages', '/opt/django/lib/python3.6/site-packages']
Server time: Sun, 24 Nov 2019 02:29:22 +0000

标签: djangodjango-rest-framework

解决方案


您收到此错误是因为没有get_object方法APIView- 您必须手动获取对象。

如果你想用getpatch方法构建端点并处理单个实例,你应该扩展RetrieveUpdateAPIView.

应该是这样的:

class RegisterDetailView(generics.RetrieveUpdateAPIView):
    queryset = Register.objects.all()
    serializer_class = RegisterSerializer

推荐阅读