【发布时间】:2019-12-19 13:34:59
【问题描述】:
我正在尝试使用 django-rest-framework 序列化程序 ModelSerializer 类创建一个 django 模型实例。这是我的序列化程序代码:
class MessageSerializer(serializers.ModelSerializer):
class Meta:
model = Message
fields = ['sender', 'chat_room', 'content', 'sending_date']
这是我尝试用它制作模型实例时的观点:
class SendMessage(APIView):
authentication_classes = [authentication.TokenAuthentication]
permission_classes = [permissions.IsAuthenticated]
def post(self, request):
try:
message_type = request.data['message_type']
if message_type == ('text' or 'image' or 'audio'):
if message_type == 'text':
message_serializer = MessageSerializer(sender=request.user, chat_room=ChatRoom.objects.get(
id=request.data['chat_room_id']), content=MessageContent(text=request.data['text']))
message = Message(message_serializer.data)
elif message_type == 'image':
message = MessageSerializer(sender=request.user.id, chat_room=request.data['chat_room_id'],
content=MessageContent(image=request.FILES['image']))
elif message_type == 'audio':
message = MessageSerializer(sender=request.user.id, chat_room=request.data['chat_room_id'],
content=MessageContent(image=request.FILES['image']))
if message.chat_room.users.all().filter(id=request.user.id).exists():
message.save()
if message_type == 'image':
resize_photo(message.content.image, MessageContent.image_width, MessageContent.image_height)
if message_type == 'audio':
if (not message.content.name.lower().endswith('mp4')) and os.get_size(message.content) > 25000:
message.delete()
raise FileSourceError
message.save()
return Response(status=status.HTTP_201_CREATED)
else:
return Response(status=status.HTTP_401_UNAUTHORIZED)
else:
return Response(status=status.HTTP_400_BAD_REQUEST)
except KeyError or FileSourceError:
return Response(status=status.HTTP_400_BAD_REQUEST)
这是我的消息模型:
class Message(models.Model):
sender = models.ForeignKey(User, related_name='sender', on_delete=models.CASCADE)
chat_room = models.ForeignKey(ChatRoom, related_name='chat_room', on_delete=models.CASCADE)
content = models.OneToOneField(MessageContent, on_delete=models.CASCADE)
is_read_by = models.ManyToManyField(User, related_name="is_read_by")
sending_date = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ('sending_date',)
但是,当我运行这段代码时,我得到了
TypeError: init() 得到了一个意外的关键字参数 'sender'
如果我删除 sender 参数,我会得到 p>
TypeError: init() 得到了一个意外的关键字参数“chat_room”
等等。我检查了我的 ModelSerializer 是否使用
制作了正确的序列化器字段print(repr(MessageSerializer()))
在 django python shell 中,我得到了
MessageSerializer():
sender = PrimaryKeyRelatedField(queryset=User.objects.all())
chat_room = PrimaryKeyRelatedField(queryset=ChatRoom.objects.all())
content = PrimaryKeyRelatedField(queryset=MessageContent.objects.all(), validators=[<UniqueValidator(queryset=Message.objects.all())>])
sending_date = DateTimeField(read_only=True)
这意味着我的序列化程序有这些字段(发件人、聊天室等) 为什么我会收到此错误,我该如何解决?感谢您的宝贵时间!
【问题讨论】:
-
请分享您的视图和模型的整个代码。
-
@HuLuViCa 完成!
标签: python django django-rest-framework serialization