我是Django REST框架的新手,我正在为一个新项目尝试它。因此,根据官方教程,我试图创建几个get/post/put请求,但是对于put请求,我得到了以下错误:
Expected view ExampleUpdateView to be called with a URL keyword argument named "pk". Fix your URL conf, or set the
.lookup_field
attribute on the view correctly.
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
我想我可能有一个问题,我有一个复合键。我尝试了其他通用视图(createapiew&ListAPIView),它们工作得非常好。我需要更新def_update
方法吗?我需要在serializers.py
中更改任何内容吗?
这是一个现有的JSON对象,我是从GET请求中获取的,并试图更新:
{
"foo_field": "john",
"bar_field": "doe",
"last_updated_by": "batman",
"last_updated_on": "2017-02-09"
}
我查看了以下副本,但这些解决方案似乎都不适合我:
Django Rest Framework: Unclear error message
首先,我将重构您的代码并给出代码示例。之后我会解释这些变化。
models.py
您已将
foo_field
设置为主键。使用字符串(VARCHAR
)作为主键是一种不好的做法。强烈建议使用surrogate keys。这将由Django自动完成。它添加了一个字段id
作为主键。serializers.py
现在将按原样工作。不需要更改。而且views.py
应该可以不做任何更改地工作。不过,我将用foo_field
作为主键来覆盖这个选项。views.py
您也可以忽略这一点,但在
urls.py
中进行一些更改是很重要的。urls.py
为了使web服务具有ReSTful,它们必须遵循REST原则。最重要的规则之一是,我们不应该在URL中使用动词来描述操作。另一种约定是,资源名称以复数形式用于描述集合,而标识符用于访问单个资源。
您的资源称为示例,因此我们使用示例作为集合名。像get或update这样的动词在URL中没有位置。HTTP方法负责正确的操作。
如果要使用
foo_field
作为主键,则必须更改更新视图的url:这是因为您的
foo_field
是一个CharField
(或字符串),所以传递给它的参数应该匹配任何字母数字字符(\w
)和连字符(-
)。如果愿意,可以在url regex中使用
foo_field
作为命名组,而不是pk
。注意,在视图中调整它,为lookup_field
和lookup_url_kwarg
设置正确的值。我再次强烈建议使用代理项键并让Django完成此任务。
现在您可以理解
ListAPIView
和CreateAPIView
工作的原因了。它们不需要传递到url的参数,并且被正确调用。您的
UpdateAPIView
无法工作,因为匹配的url只接受数字,与您的主键foo_field
不匹配。把
update()
和UpdateAPIView
一起使用。相关问题 更多 >
编程相关推荐