Django Rest Framework - 在路径参数中添加具有外键数据的对象

时间:2016-11-21 09:36:36

标签: django foreign-keys django-rest-framework

我有2个模特,代表作者他的文章,这个想法是作者可以自由添加文章(不是说它对我的问题很重要,但只是附加物)。

class Author(models.Model):
    name = ...


class Article(models.Model):
    author = models.ForeignKey(Author, related_name='articles', on_delete=models.CASCADE)
    title = ...
    content = ...
    timestamp = models.DateTimeField(auto_now=True)

我的序列号如下:

class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Author
        fields = '__all__'

class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = '__all__'

我有一个简单的观点:

@csrf_exempt
def author_articles(request, author_id):
    try:
        author = Author.objects.get(id=author_id)
    except Author.DoesNotExist:
        return HttpResponse(status=404)

    if request.method == 'GET':
        articles = author.articles.all()
        serializer = serializers.ArticlesSerializer(articles, many=True)
        return JsonResponse(serializer.data, safe=False)
    elif request.method == 'POST':
        data = JSONParser().parse(request)
        serializer = serializers.ArticlesSerializer(data=data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data, status=201)
        return JsonResponse(serializer.errors, status=400)

定义网址的地方:

url(r'^authors/(?P<author_id>[0-9]+)/articles/$', views.author_articles)

所以对URL的简单POST请求:server:port/authors/1/articles/下面的正文就像魅力一样!

{
    "author": 1,
    "title":  "foo",
    "content": "bar"
}

我的错误是我提供了两次作者身份,一次是身体,一次是路径参数。我可以轻松地从路径参数中删除它并使其工作,但我真正想要的是相反的。我希望身体没有id,并且从路径参数中推导出id。

我尝试了很多方法,但反复失败了。非常感谢帮助。

我在Postgres上使用Django和Django-Rest-Framework。

感谢。

1 个答案:

答案 0 :(得分:1)

您可以将author_id传递给序列化程序save()方法:

elif request.method == 'POST':
    data = JSONParser().parse(request)
    serializer = serializers.ArticlesSerializer(data=data)
    if serializer.is_valid():
        serializer.save(author=author.id)

一个建议,Django Rest Framework允许您编写更少的代码。您不需要JSONParserJsonResponse等常规Django视图 使用APIView类或api_view装饰器代替甚至使用viewsets它可以将功能线减少到5-6