【发布时间】:2018-07-24 10:53:27
【问题描述】:
我是 Django REST 框架的新手,我正在为我正在从事的一个新项目尝试它。因此,根据官方教程,我尝试创建几个 get/post/put 请求,但使用 put 请求时出现以下错误:
预期视图 ExampleUpdateView 将使用名为“pk”的 URL 关键字参数调用。修正您的 URL 配置,或正确设置视图上的
.lookup_field属性。
这是我需要的文件:
models.py
class ExampleModel(models.Model):
foo_field = models.CharField(primary_key=True, max_length=15)
bar_field = models.CharField(max_length=30)
last_updated_by = models.CharField(max_length=15)
last_updated_on = models.DateTimeField()
class Meta:
managed = True
db_table = 'example_db'
unique_together = (('foo_field', 'bar_field'),)
serializers.py
class ExampleSerializer(serializers.ModelSerializer):
class Meta:
model = ExampleModel
fields = ('foo_field', 'bar_field', 'last_updated_by', 'last_updated_on')
urls.py
url(r'^get_example/$', views.ExampleCreateView.as_view()),
url(r'^update_example/(?P<pk>\d+)/$',views.ExampleUpdateView.as_view()),
views.py
class ExampleCreateView(generics.CreateAPIView):
serializer_class = ExampleSerializer
queryset = ExampleModel.objects.all()
class ExampleUpdateView(generics.UpdateAPIView):
queryset = ExampleModel.objects.all()
serializer_class = ExampleSerializer
我认为我可能遇到的问题是我有一个复合键。我尝试了其他通用视图(CreateAPIView 和 ListAPIView),它们工作得非常好。我需要更新def_update 方法吗?我需要更改serializers.py 中的任何内容吗?
这是我从 GET 请求中获得并尝试更新的现有 JSON 对象:
{
"foo_field": "john",
"bar_field": "doe",
"last_updated_by": "batman",
"last_updated_on": "2017-02-09"
}
我查看了以下重复项,但这些解决方案似乎都不适合我:
Django Rest Framework: Unclear error message
【问题讨论】:
-
您的
urls.py是一个明显的反模式。那不是休息!您没有将动词放入 URL 中! HTTP 请求方法应该映射到 CRUD:POST - CREATE;获取 - 检索;放——更新;删除 - 删除。 -
您已将
foo_field设置为主键,因此您不使用复合键。 Django 不支持复合键。您拥有的是unique_together,即UNIQUE KEY,而不是复合键。顺便说一句,使用字符串作为主键是一种不好的做法。 -
您需要使用
CreateAPIView和UpdateAPIView的真正原因是什么?为什么不ListCreateAPIView和RetrieveUpdateDestroyAPIView?或者为什么不直接进入视图集?您有什么特殊要求? -
CreateAPIView 和 UpdateAPIView 只是示例。我尝试使用 RetrieveUpdateDestroyAPIView 但后者中的 put 请求仍然给我同样的错误
标签: python django rest django-models django-rest-framework