2016-11-22 82 views
0

我有一個「事件」模型,它有一個many2many字段與默認的用戶模型。'collections.OrderedDict'對象沒有屬性'用戶名'

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 

不過,我得到一個錯誤,如belowe圖像中

enter image description here

//這是我用

enter image description here

+0

你能提供用戶模型。 – marin

+0

@marin用戶模型是由django提供的默認用戶模型 – cano

+0

您確定使用'GET'或'PATH'方法嗎? –

回答

0

你可以嘗試用APIView下面的代碼?

模型

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) 

URL-S

urlpatterns = [ 

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

JOSN的exaple爲把

JSON

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

當我這樣做時,我甚至無法打開APIView。它給了我一個像下面的錯誤; TypeError at/participants/1/ 'ListSerializer'對象不可調用 – cano

+0

請參閱ManyToMayn關係的文檔:http://www.django-rest-framework.org/api-guide/relations/#manytomanyfields-with-a-通過型號 – marin

+0

我已經讀過好幾次了。將read_only設置爲true對我無效 – cano

相關問題