Django Rest框架:viewset或序列化程序中需要外键字段
我对Django Rest框架(DRF)非常陌生。我曾读到Django Rest框架:viewset或序列化程序中需要外键字段,django,django-rest-framework,django-serializer,django-rest-viewsets,Django,Django Rest Framework,Django Serializer,Django Rest Viewsets,我对Django Rest框架(DRF)非常陌生。我曾读到viewset非常好,因为它减少了代码量,但我发现它更复杂 说明: 假设我想实现一个电话簿API,其中我们有一些用户,每个用户都有自己的联系人,每个联系人可以有几个电话号码。我这里有三个模型 用户(默认Django模型) 接触 电话号码 问题定义 我想要的是使用当前的请求创建新联系人。user。因此,我应该让我的联系人.serializer如下所示: class ContactSerializer(serializers.ModelSer
viewset
非常好,因为它减少了代码量,但我发现它更复杂
说明:
假设我想实现一个电话簿API,其中我们有一些用户,每个用户都有自己的联系人,每个联系人可以有几个电话号码。我这里有三个模型
请求创建新联系人。user
。因此,我应该让我的联系人.serializer
如下所示:
class ContactSerializer(serializers.ModelSerializer):
owner = serializers.SlugRelatedField(queryset=User.objects.all(), slug_field='user')
class Meta:
model = Contact
fields = ['id', 'owner', 'name', 'description']
read_only_fields = ['owner']
我的观点是:
class ContactViewSet(viewsets.ModelViewSet):
queryset = Contact.objects.all()
serializer_class = ContactSerializer
permission_classes = [IsCreator]
def get_permissions(self):
if self.request.method == "GET":
self.permission_classes = [IsCreator, permissions.IsAdminUser,]
if self.request.method == "POST":
self.permission_classes = [permissions.IsAuthenticated,]
if self.request.method == "PUT":
self.permission_classes = [IsCreator]
if self.request.method == "DELETE":
self.permission_classes = []
return super(ContactViewSet, self).get_permissions()
错误每当我想使用邮递员
发布新联系人时,我都会传递姓名
、说明
和所有者
,它应该会从请求中自动检测到所有者,但它没有,我收到以下错误:
PS:如果需要在此处签出项目,请单击此处
我该怎么办?应用以下更改后,问题得到解决 apps.contacts.views.py:
class ContactSerializer(serializers.ModelSerializer):
class Meta:
model = Contact
fields = ['id', 'name', 'description', 'owner']
将以下方法添加到类的主体中
def perform_create(self, serializer):
return serializer.save(owner = self.request.user)
apps.contacts.serializers.py:
class ContactSerializer(serializers.ModelSerializer):
class Meta:
model = Contact
fields = ['id', 'name', 'description', 'owner']
PS我也在寻找更多答案,在本例中添加您的答案。应用以下更改后,问题已解决 apps.contacts.views.py:
class ContactSerializer(serializers.ModelSerializer):
class Meta:
model = Contact
fields = ['id', 'name', 'description', 'owner']
将以下方法添加到类的主体中
def perform_create(self, serializer):
return serializer.save(owner = self.request.user)
apps.contacts.serializers.py:
class ContactSerializer(serializers.ModelSerializer):
class Meta:
model = Contact
fields = ['id', 'name', 'description', 'owner']
PS我也在寻找更多答案,在本例中添加您的答案。您可以做的一件事是添加currentuserdefault。像这样
class ContactSerializer(serializers.ModelSerializer):
owner = serializers.HiddenField(default=serializers.CurrentUserDefault())
class Meta:
model = Contact
fields = ['id', 'owner', 'name', 'description']
在您的视图代码中,请记住在上下文中传递请求。像这样
class ContactViewSet(viewsets.ModelViewSet):
queryset = Contact.objects.all()
serializer_class = ContactSerializer
permission_classes = [IsCreator]
def get_serializer_context(self):
context = super().get_serializer_context()
context.update({"request": self.request})
return context
您可以做的一件事是添加currentuserdefault。像这样
class ContactSerializer(serializers.ModelSerializer):
owner = serializers.HiddenField(default=serializers.CurrentUserDefault())
class Meta:
model = Contact
fields = ['id', 'owner', 'name', 'description']
在您的视图代码中,请记住在上下文中传递请求。像这样
class ContactViewSet(viewsets.ModelViewSet):
queryset = Contact.objects.all()
serializer_class = ContactSerializer
permission_classes = [IsCreator]
def get_serializer_context(self):
context = super().get_serializer_context()
context.update({"request": self.request})
return context
它应该会自动从请求中检测到所有者
但是我没有看到任何代码执行此操作?可能是相关的:@Alvi15请给我一个答案好吗?我真的需要你的帮助。请查看相关链接,看看它是否有效。@Alvi15我收到了一个新错误它应该会自动从请求中检测到所有者
我没有看到任何代码执行此操作?可能相关:@Alvi15请给我一个答案好吗?我真的需要你的帮助。请查看相关链接,看看它是否有效。@Alvi15我收到了一个新错误TypeError:Field'id'需要一个数字,但得到了HiddenField(default=CurrentUserDefault())。
这个错误刚刚发生。我已经安装了你的应用程序,并完成了我建议的上述更改,工作正常。但有一件事请确保在contactviewsets中删除此def perform\u create(self,serializer):返回serializer.save(owner=self.request.user)
TypeError:Field'id'需要一个数字,但得到了HiddenField(default=CurrentUserDefault()).
此错误刚刚发生。我已安装了你的应用程序,并执行了我建议的上述更改,其工作正常。但有一件事请确保在ContactViewSet中删除此def perform\u create(self,serializer):返回serializer.save(owner=self.request.user)