2016-03-25 17 views
1

Ich suchte eine Antwort auf diese Frage speziell für Django Rest, aber ich habe nirgends eine gefunden, obwohl ich denke, eine Menge Leute haben dieses Problem. Ich versuche, ein Objekt mit mehreren verschachtelten Beziehungen zu erstellen, aber etwas verhindert dies. Hier sind meine Modelle als Referenz:Django Rest erstellt verschachtelte Objekte (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()]) 

Und hier meine Serializer sind:

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 

Was ich habe Probleme mit der create() Methode auf UserSerializer. Was passiert ist, kann ich nicht .add() die Daten von favorites_data bis favorite Objekt. Ich bekomme einen Fehler, der invalid literal for int() with base 10: 'items' sagt. Ich denke, das macht Sinn, aber wenn ich dies versuchen, statt die Verwendung for-Schleife:

favorite.items.add(**favorites_data) 

bekomme ich nur eine Fehlermeldung, add() got an unexpected keyword argument 'items'. Schließlich Wenn ich das versuchen:

favorite.items.add(favorites_data) 

bekomme ich nur diesen Fehler: unhashable type: 'OrderedDict'

Was bin ich in diesem Ansatz falsch? Offensichtlich existieren favorites_data, aber ich füge es nicht richtig ein. Danke für jede Hilfe!

+0

Können Sie uns den Inhalt der 'favorites_data 'ist? – ArtOfWarfare

+0

@ArtOfWarfare Hier ist es: 'OrderedDict ([(u'items ', [])]]'. Es ist der Inhalt des Elements, das ich auswähle, um das 'favorite' Feld von' UserSerializer' zu füllen. – tear728

Antwort

1

Ich denke favorite.items.add Sie in einer einzigen Instanz eines Item passieren erwartet, so sollten Sie diese ersetzen:

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

mit diesem:

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

Dies ist sehr nah, aber nur das n-te Element wird hinzugefügt, auch wenn mehrere Optionen ausgewählt werden. – tear728

+0

Eigentlich könnte deine Antwort richtig sein. Nur eine Instanz des Elements kommt in die validierten Daten, selbst wenn mehrere Optionen ausgewählt werden ... was ziemlich merkwürdig ist – tear728

Verwandte Themen