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!
Können Sie uns den Inhalt der 'favorites_data 'ist? – ArtOfWarfare
@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