简体   繁体   English

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

[英]all() got an unexpected keyword argument 'pk' in Django

I've got a problem with Django and the Django REST Framework. 我在Django和Django REST Framework上遇到问题。

When I go to http://mynameislee.co.uk/albums/ it works fine and returns the Django Framework fine but when I try http://mynameislee.co.uk/albums/1 I get all() got an unexpected keyword argument 'pk'. 当我转到http://mynameislee.co.uk/albums/时,它可以正常工作并返回Django框架,但是当我尝试http://mynameislee.co.uk/albums/1时 ,得到的all()出现了意外关键字参数“ pk”。

This is my code. 这是我的代码。

urls.py 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'),

views.py views.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)

models.py models.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

You cant use all with a filter set. 您不能将all与过滤器集一起使用。

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

Use filter instead: 使用filter代替:

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

Here are the docs with a lot of examples. 这是带有大量示例的文档

And as @Bjorn suggested: you can also use get that will save you getting the item from the queryset: 就像@Bjorn建议的那样:您还可以使用get来节省从queryset获取项目的时间:

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

I think you want 我想你要

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

instead of 代替

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM