【问题标题】:How to fix 'TypeError: __init__() got an unexpected keyword argument 'sender''如何修复'TypeError: __init__() 得到了一个意外的关键字参数'sender''
【发布时间】: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


【解决方案1】:

您应该将Message 模型实例传递给MessageSerializerdict,其中包含具有fields 中指定的键的数据。

如果您想传递dict,请将dict 传递给data 关键字。

message_dict = {'sender': request.user, 'chat_room': ChatRoom.objects.get(id=request.data['chat_room_id']), 'content': MessageContent(text=request.data['text'])}
message_serializer = MessageSerializer(data=message_dict)

if message_serializer.is_valid():
    message_serializer.save()

确保您的MessageSerializer 中实现了create 方法。

【讨论】:

  • 我试图给 init 函数一个 dict 而不是多个 kargs,但我仍然得到 TypeError: __init__() got an unexpected keyword argument 'sender'
  • 按照说明here.
  • 我现在要睡觉了,但明天会检查一下,谢谢
  • @VincentQuirion 如果不能解决您的问题,请告诉我。
  • 不客气。另外,如果答案有帮助,那么在将来帮助有类似问题的人时,最好投票。 :)
【解决方案2】:

model.py文件中的类属性之一发生变化

identification = models.IntegerField()

model.py文件中的类属性之一发生变化

identification = models.IntegerField ()

不要在括号内留下任何内容,然后在控制台中使用以下命令检查

python manage.py check application_name

【讨论】:

    猜你喜欢
    • 2012-12-11
    • 1970-01-01
    • 2017-10-16
    • 2020-10-22
    • 2021-11-17
    • 2016-11-01
    • 2021-10-21
    • 2021-10-15
    • 2021-12-30
    相关资源
    最近更新 更多