all() 在 Django 中得到了一个意外的关键字参数 'pk'



我遇到了Django和Django REST框架的问题。

当我去http://mynameislee.co.uk/albums/它运行良好,返回Django框架也很好,但当我尝试http://mynameislee.co.uk/albums/1我得到了一个意外的关键字参数"pk"。

这是我的密码。

urls.py

# API
url(r'^albums/$', 'canary.views.album_list', name='album_list'),
url(r'^albums/(?P<pk>[0-9])$', 'canary.views.album_detail', name='album_detail'),

视图.py

@login_required
@api_view(['GET', 'POST'])
def album_list(request):
# List all tasks, or create a new task.
if request.method == 'GET':
    album = Album.objects.all()
    serializer = AlbumSerializer(album, many=True)
    return Response(serializer.data)
elif request.method == 'POST':
    serializer = AlbumSerializer(data=request.DATA)
if serializer.is_valid():
   serializer.save()
   return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
  return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@login_required
@api_view(['GET', 'PUT', 'DELETE'])
def album_detail(request, pk):
# Get, update or delete a specific album
try:
  album = Album.objects.all(pk=id)
except Album.DoesNotExist:
  return Response(status=status.HTTP_404_NOT_FOUND)
if request.method == 'GET':
  serializer = AlbumSerializer(album)
  return Response(serializer.data)
elif request.method == 'PUT':
  serializer = AlbumSerializer(album, data=request.DATA)
  if serializer.is_valid():
    serializer.save()
  return Response(serializer.data)
else:
  return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
elif request.method == 'DELETE':
  album.delete()
  return Response(status=status.HTTP_204_NO_CONTENT)

型号.py

class Album(models.Model):
  album_id = models.AutoField(primary_key=True)
  artist_name = models.CharField(max_length=255, blank=True)
  album_name = models.CharField(max_length=255, blank=True)
  def __unicode__(self):
       return self.album_name

不能将all与筛选器集一起使用。

album = Album.objects.all(pk=id) #wrong

改为使用filter

album = Album.objects.filter(pk=id)
>>> type(album) -> 'QuerySet'

以下是文档中的许多示例。

正如@Bjorn所建议的:你也可以使用get,这将节省你从查询集获得项目的时间:

album = Album.objects.get(pk=id)
>>> type(album) -> 'Album'

我想你想要

album = Album.objects.filter(pk=id)

而不是

album = Album.objects.all(pk=id)

相关内容

最新更新