2016-03-25 11 views
1

Django Restのためのこの質問に対する答えを探しましたが、私はどこにも見つけられませんでしたが、多くの人がこの問題を抱えていると思います。私は複数のネストされた関係を持つオブジェクトを作成しようとしていますが、何かがこれを起こさないようにしています。ここに私のモデルは参考用です:Django Restはネストされたオブジェクトを作成しています(ManyToMany)

class UserProfile(models.Model): 
    user = models.OneToOneField(User, unique=True, null=True) 
    tmp_password = models.CharField(max_length=32) 
    photo = models.ImageField(upload_to='media/', blank=True, null=True) 
    likes = models.IntegerField(blank=True, null=True) 
    dislikes = models.IntegerField(blank=True, null=True) 

    def __unicode__(self): 
     return unicode(self.user.username) 

class Item(models.Model): 
"""Item Object Class""" 
    id = models.AutoField(primary_key=True) 
    name = models.CharField(max_length=125, blank=True) 
    price = models.FloatField(default=0, blank=True) 
    rating = models.IntegerField(default=0, blank=True) 
    description = models.TextField(max_length=300, blank=True) 
    photo = models.ImageField(upload_to="media/", blank=True) 
    barcode = models.CharField(max_length=20, blank=True) 
    photo_url = models.URLField(max_length=200, blank=True) 
    item_url = models.URLField(max_length=200, blank=True) 

    def __unicode__(self): 
     return unicode(self.name) 


class Favorite(models.Model): 
    user = models.OneToOneField(User, null=True) 
    items = models.ManyToManyField(Item) 

    def __unicode__(self): 
     return unicode(self.user.username) 

    def admin_names(self): 
     return '\n'.join([a.name for a in self.items.all()]) 

そして、ここでは私のシリアライザです:

class ItemSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Item 
     fields = ('id', 'name', 'price', 'description', 'rating', 'photo', 'barcode', 'photo_url','item_url') 


class FavoriteSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Favorite 
     exclude = ('id', 'user') 


class UserProfileSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = UserProfile 
     fields = ('likes', 'dislikes', 'photo', 'tmp_password') 


class UserSerializer(serializers.HyperlinkedModelSerializer): 
    userprofile = UserProfileSerializer() 
    favorite = FavoriteSerializer() 
    class Meta: 
     model = User 
     fields = (
      'id', 'username', 'url', 
      'email', 'is_staff', 'password', 
      'userprofile', 'favorite' 
      ) 

    def create(self, validated_data): 
     profile_data = validated_data.pop('userprofile') 
     favorites_data = validated_data.pop('favorite') 
     user = User.objects.create_user(**validated_data) 
     user_profile = UserProfile.objects.create(user=user, **profile_data) 
     favorite = Favorite(user=user) 
     favorite.save() 
     print favorite.items 
     for item in favorites_data: 
      favorite.items.add(item) 
     print favorite.items 
     return user 

私はとのトラブルを抱えています何UserSerializercreate()方法です。何が起こっているのですかfavorites_dataからfavoriteオブジェクトのデータは.add()できません。 invalid literal for int() with base 10: 'items'というエラーが表示されます。私は、これは理にかなっていると思いますが、私が代わりにforループを使用するのではこれをしようとした場合:

favorite.items.add(**favorites_data) 

私はちょうどadd() got an unexpected keyword argument 'items'を言って、エラーを取得します。最後に、私はこのしよう:私はちょうどこのエラーを取得する

favorite.items.add(favorites_data) 

を:unhashable type: 'OrderedDict'

私は、このアプローチで間違って何をしているのですか?明らかに、favorites_dataが存在しますが、正しく挿入していません。助けてくれてありがとう!

私は favorite.items.addはあなたがこれを交換する必要がありますので、あなたは、 Itemの単一のインスタンスを渡すことを期待だと思う
+0

あなたは私たちにfavorites_data 'の内容を与えることができます'は? – ArtOfWarfare

+0

@ArtOfWarfareここでは、次のとおりです: 'OrderedDict([(u'items '、[])))'。これは 'UserSerializer'の' favorite'フィールドを設定するために選択した項目の内容です。 – tear728

答えて

1

:これにより

for item in favorites_data: 
    favorite.items.add(item) 

for key in favorites_data: 
    for item in favorites_data[key]: 
     favorite.items.add(item) 
+0

これはスーパークローズですが、複数のオプションを選択しても、n番目のアイテムだけが追加されています。 – tear728

+0

実際、あなたの答えは正しいかもしれません。複数のオプションを選択した場合でも、検証されたデータに入っているアイテムは1つだけです...これは奇妙です – tear728

関連する問題