2016-03-25 29 views
1

Ö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!

+0

Bize 'favorites_data içeriğini verebilir: Bununla

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

nedir? – ArtOfWarfare

+0

@ArtOfWarfare İşte bu: 'OrderedDict ([(u'items ', [])])'. UserSerializer'ın 'favori 'alanını doldurmak için seçtiğim öğenin içeriği. – tear728

cevap

1

Ben favorite.items.add bir Item tek örneğinde geçmesini bekliyor düşünüyorum, bu yüzden bu değiştirmeniz gerekir:

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

Bu süper yakın, ancak birden fazla seçenek seçerken bile sadece nth öğe ekleniyor. – tear728

+0

Aslında cevabınız doğru olabilir. Birden fazla seçenek seçerken bile doğrulanmış verilerde yalnızca bir öğe örneği geliyor. – tear728

İlgili konular