2016-11-22 6 views
0

私は "イベント"モデルを持っていて、デフォルトのユーザーモデルを持つmany2manyフィールドを持っています。'collections.OrderedDict'オブジェクトに 'username'という属性がありません

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

を使用API​​Viewあるようにしかし、私はエラーを取得していますあなたが試すことができますこのコードは以下の通りですか?

モデル

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/participants/1/ 'ListSerializer'オブジェクトが呼び出せません – cano

+0

ManyToMayn関係のドキュメントを参照してください:http://www.django-rest-framework.org/api-guide/relations/#manytomanyfields-with-a-モデルを通じて – marin

+0

私はすでに何度もそれを読んできました。 read_onlyをtrueに設定すると、私のためには機能しません – cano

関連する問題