H. *_*Boe 5 python django django-rest-framework reactjs
我试图添加评论到我的数据库,但收到错误 'OrderedDict' object has no attribute 'pk'
react.js处理POST请求的代码部分:
addComment() {
let url = this.props.post_url
axios.post('/api/comments/', {
post: url,
user: "http://127.0.0.1:8000/api/users/1/?format=json",
text: document.getElementsByName(url)[0].value,
csrfmiddlewaretoken: document.getElementsByName("csrfmiddlewaretoken")[0].value},
)
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
}
Run Code Online (Sandbox Code Playgroud)
我的serializers.py:
from django.contrib.auth.models import User
from rest_framework import serializers
from .models import Post, Comment
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'url')
class CommentSerializer(serializers.HyperlinkedModelSerializer):
#user = UserSerializer(many=False, required=False)
class Meta:
model = Comment
fields = ('id', "post", "user", 'text')
read_only_fields = ('id', "user")
def create(self):
user = None
request = self.context.get("request")
if request and hasattr(request, "user"):
user = request.user
class PostSerializer(serializers.HyperlinkedModelSerializer):
#user = UserSerializer(required=False)
comments = CommentSerializer(many=True, required=False, read_only=True)
class Meta:
model = Post
fields = ('id', 'title', "user", "url", "comments", 'text')
read_only_fields = ('id', "url", "comments")
def save(self):
user = None
request = self.context.get("request")
if request and hasattr(request, "user"):
user = request.user
Run Code Online (Sandbox Code Playgroud)
我的views.py
from django.contrib.auth.models import User
from api.serializers import UserSerializer
from rest_framework import viewsets
from .models import Comment, Post
from .serializers import CommentSerializer, PostSerializer
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
class CommentViewSet(viewsets.ModelViewSet):
queryset = Comment.objects.all()
serializer_class = CommentSerializer
class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
Run Code Online (Sandbox Code Playgroud)
发送邮件请求时,它通过正常的方式发送.如果我删除其中一个字段,它返回a 400.现在我得到了这个500 [Internal server] error.
AttributeError:'OrderedDict'对象没有属性'pk'
该错误似乎来自:
get_url中的/home/halvor1606/.virtualenvs/django-react/local/lib/python2.7/site-packages/rest_framework/relations.py
Run Code Online (Sandbox Code Playgroud)# Unsaved objects will not yet have a valid URL. if hasattr(obj, 'pk') and obj.pk in (None, ''): return NoneHere-> lookup_value = getattr(obj,self.lookup_field)...
Run Code Online (Sandbox Code Playgroud)kwargs = {self.lookup_url_kwarg: lookup_value} return self.reverse(view_name, kwargs=kwargs, request=request, format=format) def get_name(self, obj): return six.text_type(obj)
▶本地变量如下: -
Variable Value
request <rest_framework.request.Request object at 0x7f4e59e75b90>
view_name 'post-detail'
obj OrderedDict([(u'title', u'adskjfj|'), (u'user', <User: halvor1606>), (u'text', u'kjkldsjf')])
self HyperlinkedIdentityField(read_only=True, view_name='post-detail')
format None
Run Code Online (Sandbox Code Playgroud)
阅读具有相同错误的其他问题.没有找到解决我问题的方法.
谢谢!
编辑:
通过将此添加到我的帖子序列化器解决它:
def create(self, validated_data):
tmp_post = validated_data
user = None
request = self.context.get("request")
if request and hasattr(request, "user"):
user = request.user
post = Post.objects.create(
user=user,
title=tmp_post['title'],
text=tmp_post['text'],
)
return post
Run Code Online (Sandbox Code Playgroud)
我认为这只是因为你url这里是空的:
addComment() {
let url = this.props.post_url
axios.post('/api/comments/', {
post: url,
user: "http://127.0.0.1:8000/api/users/1/?format=json",
text: document.getElementsByName(url)[0].value,
csrfmiddlewaretoken: document.getElementsByName("csrfmiddlewaretoken")[0].value},
)
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
}
Run Code Online (Sandbox Code Playgroud)
既然您指定了class CommentSerializer(serializers.HyperlinkedModelSerializer):,文档中就提到了这一点:
需要有一种方法来确定哪些视图应该用于模型实例的超链接。
默认情况下,超链接应对应于与样式“{model_name}-detail”匹配的视图名称,并通过 pk 关键字参数查找实例。
因此,HyperlinkedModelSerializer尝试找到一个应该用于链接到 Post 对象的视图,但找不到它。高度怀疑帖子网址为空id
| 归档时间: |
|
| 查看次数: |
1296 次 |
| 最近记录: |