使用REST Framework查询URL中的参数

Eli*_*era 5 django rest deserialization

我,几天前盯着使用REST Framework,但是我找不到如何使用参数创建一个自定义的url,在Django中这种url是这样编写的.

url(r'^author/(?P<author>\d+)/books/$', BooksList.as_view(), name = 'books'),
Run Code Online (Sandbox Code Playgroud)

为了这

http://mysite/author/1/books
Run Code Online (Sandbox Code Playgroud)

我试试:

router.register(r'author/(?P<author>\d+)/books', BooksList, base_name = 'Books')
Run Code Online (Sandbox Code Playgroud)

但这不起作用.

我,看到这个问题,但是,不工作: 问题1 问题2

这是我的代码.

# models.py
class Author(models.Model):
    Name = models.CharField(max_length = 50)

class Book(models.Model):
    Book = models.ForeignKey(Author)
    Title = models.CharField(max_length = 200)

    def __unicode__(self):
        return self.Title


# views.py
class BooksList(viewsets.ModelViewSet):
    model = Book
    serializer_class = BookSerializer
    def get_queryset(self):
        author = self.kwargs['author']
        queryset = Book.objects.filter(Author = author)
        return queryset

# urls.py
router = routers.DefaultRouter()
router.register(r'books', BooksList, base_name = 'Books')

admin.autodiscover()

urlpatterns = patterns('',
    url(r'^api/', include('rest_framework.urls', namespace = 'rest_framework')),
)
Run Code Online (Sandbox Code Playgroud)

Eli*_*era 2

我解决了这个问题,阅读教程第二部分“向我们的 URL 添加可选格式后缀”,

最后我得到这样的网址:

http://localhost:8001/books/author/1/
Run Code Online (Sandbox Code Playgroud)

这是我的代码。

# urls.py
url(r'^books/author/(?P<author>\d+)/$', BooksByAuthor, name='BooksByAuthor'),

# serializer.py
class BooksSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = ('id', 'Title')

# views.py
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
from .serializers import *

class JSONResponse(HttpResponse):
    def __init__(self, data, **kwargs):
        content = JSONRenderer().render(data)
        kwargs['content_type'] = 'application/json'
        super(JSONResponse, self).__init__(content, **kwargs)

def BooksByAuthor(request, author):
    try:
        books = Book.objects.filter(Author = author).order_by('Title')
    except Book.DoesNotExist:
        return HttpResponse(status=400)

    if request.method == 'GET':
        serializer = BooksSerializer(books)
        return JSONResponse(serializer.data)
Run Code Online (Sandbox Code Playgroud)