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
私はとのトラブルを抱えています何UserSerializer
にcreate()
方法です。何が起こっているのですか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
の単一のインスタンスを渡すことを期待だと思う
あなたは私たちにfavorites_data 'の内容を与えることができます'は? – ArtOfWarfare
@ArtOfWarfareここでは、次のとおりです: 'OrderedDict([(u'items '、[])))'。これは 'UserSerializer'の' favorite'フィールドを設定するために選択した項目の内容です。 –
tear728