【问题标题】:'collections.OrderedDict' object has no attribute 'username'“collections.OrderedDict”对象没有属性“用户名”
【发布时间】:2016-11-22 01:27:29
【问题描述】:

我有一个“事件”模型,它有一个带有默认用户模型的 many2many 字段。

class Event(models.Model):
    name = models.CharField(max_length=50)
    type = models.CharField(max_length=50)
    location = models.CharField(max_length=255)
    start_hour = models.CharField(max_length=50)
    end_hour = models.CharField(max_length=50)
    creator = models.CharField(max_length=50)
    info = models.CharField(max_length=255, default='')
    users = models.ManyToManyField(User)

    def __str__(self):
        return self.name

现在,我正在尝试更新此 many2many 字段,如下所示;

//my serializers

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id',)


class EventSerializer(serializers.ModelSerializer):
    users = UserSerializer(many=True)

    class Meta:
        model = Event
        fields = ('id', 'users')

    def update(self, instance, validated_data):
        submitted_users = validated_data.get('users')
        if submitted_users:
            for user in submitted_users:
                user_instance = User.objects.get(id=user.id)
                instance.users.add(user_instance)
        instance.save()
        return instance

//views.py

class UpdateParticipants(generics.RetrieveUpdateDestroyAPIView):
    queryset = Event.objects.all()
    serializer_class = EventSerializer

但是,我收到如下图所示的错误

//这是我使用的APIView

【问题讨论】:

  • 能否提供用户模型。
  • @marin 用户模型是 django 提供的默认用户模型
  • 您确定使用GET 或PATH 方法吗?

标签: django django-rest-framework django-serializer


【解决方案1】:

你可以试试下面这段代码吗?

型号

示例

class UserModel(User):
    pass

class Event(models.Model):
    name = models.CharField(max_length=50)
    type = models.CharField(max_length=50)
    location = models.CharField(max_length=255)
    start_hour = models.CharField(max_length=50)
    end_hour = models.CharField(max_length=50)
    creator = models.CharField(max_length=50)
    info = models.CharField(max_length=255, default='')
    users = models.ManyToManyField(User, related_name='event_user') # Set related name to User object for Rest Framework

    def __str__(self):
        return self.name

序列化器

class EventSerializer(serializers.ModelSerializer):
    users = serializers.PrimaryKeyRelatedField(queryset=User.objects.all(), required=False)
    class Meta:
        model = Event
class Userserializer(serializers.ModelSerializer):
    event_user = EventSerializer(many=True)
    class Meta:
        model = UserModel

    def update(self, instance, validated_data):
        event_user = validated_data.pop('event_user', None)
        print (event_user)

        if validated_data:
            for attr, value in validated_data.items():
                if attr == 'password':
                    instance.set_password(value)
                else:
                    setattr(instance, attr, value)
            instance.save()
        return instance

观看次数

class EventView(APIView):
    permission_classes = (AllowAny,)

    def get(self):
        qv = User.objects.all()
        serializer = Userserializer(qv, many=True)
        return Response(data={'users': serializer.data}, status=status.HTTP_200_OK)

    def put(self, request, user_id):
        instance = Event.objects.get(user=user_id)
        serializer = Userserializer(instance=instance,data=request.data, partial=True)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response(data={'users': serializer.data}, status=status.HTTP_200_OK)
        return Response(data={'users': serializer.errors}, status=status.HTTP_403_FORBIDDEN)  

网址-s

urlpatterns = [

    url(r'^users/(?P<user_id>\d+)',EventView.as_view())
]

JOSN 用于 put 的例子

JSON

{
    "id":1,
    "event_user":[{
        "name":"Changed Name"
    }]
}

【讨论】:

  • 当我这样做时,我什至无法打开 APIView。它给了我一个类似以下的错误; /participants/1/ 'ListSerializer' 对象的 TypeError 不可调用
  • 请查看 ManyToMayn 关系的文档:django-rest-framework.org/api-guide/relations/…
  • 我已经读了好几遍了。将 read_only 设置为 true 对我不起作用
  • 感谢您的详细回答,它没有用。我认为问题是,我无法从 valid_data 获取数据。我试图打印它,但我不能。如何打印验证数据
  • GET 有什么问题?
猜你喜欢
  • 2021-02-04
  • 2018-10-01
  • 2020-11-18
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 2021-05-02
  • 2018-03-30
相关资源
最近更新 更多