我有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。
感谢。
答案 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允许您编写更少的代码。您不需要JSONParser
,JsonResponse
等常规Django视图
使用APIView
类或api_view
装饰器代替甚至使用viewsets
它可以将功能线减少到5-6