python - Django Rest 创建嵌套对象(ManyToMany)

标签 python django post django-rest-framework

我专门为 Django Rest 寻找了这个问题的答案,但我还没有在任何地方找到答案,尽管我认为很多人都有这个问题。我正在尝试创建一个具有多个嵌套关系的对象,但有些东西阻止了这种情况的发生。以下是我的模型供引用:

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() 方法。发生的情况是我无法将 .add() 数据从 favorites_data 添加到 favorite 对象。我收到一条错误消息,指出以 10 为基数的 int() 的文字无效:'items'。我想这是有道理的,但如果我尝试这个而不是使用 for 循环:

favorite.items.add(**favorites_data)

我刚刚收到一条错误消息,指出 add() 获得了意外的关键字参数“items”。最后,如果我尝试这个:

favorite.items.add(favorites_data)

我刚刚收到此错误:unhashable type: 'OrderedDict'

我这种方法做错了什么?显然,favorites_data 存在,但我没有正确插入它。感谢您的帮助!

最佳答案

我认为 favorite.items.add 希望您传入 Item 的单个实例,因此您应该替换此:

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

这样:

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

关于python - Django Rest 创建嵌套对象(ManyToMany),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36226831/

相关文章:

python - 如何简化重复的 Python PuLP 语法?

python - 在 Django 中发出 POST 请求后无法进行简单的重定向(使用 HttpResponseRedirect)

python - Django相关模型未更新管理中的相关对象

c# - 如何将屏幕截图发送到 Controller ?

Javascript - 从未打开的页面访问元素

javascript - 将单选按钮的值发布到电子邮件

python - 使用Python正则表达式忽略字符串中的 `:`

python - 满足条件时关闭程序

python - 一个接一个地运行两个ffmpeg命令

python - 统一码编码错误 : 'ascii' codec can't encode characters in position 1-4: ordinal not in range(128)