Özellikle Django Rest için bu soruya bir cevap aradım, ancak bir çok insanın bu konuya sahip olduğunu düşünmeme rağmen, hiçbir yerde bulamadım. Birden çok iç içe geçmiş ilişkileri olan bir nesne oluşturmaya çalışıyorum ama bir şey bunun olmasını engelliyor. İşte benim modelleri referans amaçlıdır:Django Sonsuzluk Oluşturma Nesneleri Oluşturma (ManyToMany)
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
Ne ile sorun yaşıyorum UserSerializer
üzerinde create()
yöntemdir:
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()])
İşte benim serializers vardır. Neler oluyor favorites_data
'dan favorite
nesnesine veri alamıyorum. invalid literal for int() with base 10: 'items'
diyerek bir hata alıyorum. Bu mantıklı tahmin ediyorum, ama bunun yerine döngü için kullanmanın bu denerseniz:
favorite.items.add(**favorites_data)
Sadece add() got an unexpected keyword argument 'items'
söyleyerek bir hata alıyorum. Son olarak, bu deneyin:
favorite.items.add(favorites_data)
Sadece bu hatayı alıyorum: unhashable type: 'OrderedDict'
Ben bu yaklaşımın yanlış yapıyorum? Açıkçası, favorites_data
var, ancak düzgün şekilde yerleştirmiyorum. Herhangi bir yardım için teşekkürler!
Bize 'favorites_data içeriğini verebilir: Bununla
nedir? – ArtOfWarfare
@ArtOfWarfare İşte bu: 'OrderedDict ([(u'items ', [])])'. UserSerializer'ın 'favori 'alanını doldurmak için seçtiğim öğenin içeriği. –
tear728