django - 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
解决方案
您收到此错误是因为没有get_object
方法APIView
- 您必须手动获取对象。
如果你想用get
和patch
方法构建端点并处理单个实例,你应该扩展RetrieveUpdateAPIView
.
应该是这样的:
class RegisterDetailView(generics.RetrieveUpdateAPIView):
queryset = Register.objects.all()
serializer_class = RegisterSerializer
推荐阅读
- ms-access - MS Access 事件模型 - 拦截记录写入
- drupal - Drupal 8 使用 addexpression 合并查询?
- javascript - 如何仅在收到授权事件时才调用由其他事件触发的函数?
- asp.net - 在 ASP.NET Web 窗体中,客户端每 5 秒调用一次代码隐藏
- php - CLI 运行 PHP 7.1 但 Apache 7.0
- php - phpmailer(从 godaddy 发送电子邮件的问题)
- angular - 数据只在刷新后显示
- c# - 如何仅基于 Twilio 的帐户 sid 和令牌获取所有电话号码?
- opengl-es-3.0 - 为什么 WebGL2ReneringContext 缺少 SRGB_ALPHA?
- symfony - Symfony 表单在数据库中只插入一个字段