当前位置: 首页 > 面试题库 >

Django Rest按id更新多对多

井洲
2023-03-14
问题内容

我是python和django rest的新手。但我很困惑。最好的方法是什么
更新django rest框架中的多对多关系。我看了文件
<http://www.django-rest-framework.org/api-guide/relations/#manytomanyfields-默认情况下,使用-a-through-model>时,以
指定了直通模型的ManyToManyField设置为只读。
如果显式指定一个指向ManyToManyField的关系字段
对于直通模型,请确保将read\u only设置为True。
如果我有密码

class Master(models.Model):
    # other fields  
    skills = models.ManyToManyField(Skill)

class MasterSerializer(serializers.ModelSerializer):
    skills = SkillSerializer(many=True, read_only=False)

这将返回技能作为对象列表。我没有办法更新
他们。据我所知,Django更喜欢使用对象而不是对象id
说到M2M,如果我使用yii或rails,我将使用“through”
模型。我想获得技能领域。我能读能写。以及
我可以为写操作做这个

class MasterSerializer(serializers.ModelSerializer):
    skill_ids = serializers.ListField(write_only=True)

    def update(self, instance, validated_data):

    # ...
    validated_data['skill_ids'] = filter(None, validated_data['skill_ids'])
    for skill_id in validated_data['skill_ids']:
        skill = Skill.objects.get(pk=skill_id)
        instance.skills.add(skill)

    return instance

但我不能让它在野外返回技能ID。为读写工作操作。


问题答案:

有几件事要注意。
首先,在示例中没有显式的through表。所以你可以
跳过那部分。
第二,您正在尝试使用更复杂的嵌套序列化程序
而不是你想要达到的目标。
您可以使用PrimaryKeyRelatedField简单地读/写相关id:

class MasterSerializer(serializers.ModelSerializer):
    skills_ids = serializers.PrimaryKeyRelatedField(many=True, read_only=False, queryset=Skill.objects.all(), source='skills')

Which should be able to read/write:

{id: 123, first_name: "John", "skill_ids": [1, 2, 3]}

注意,从JSON的“skill\u id”到模型的“skills”的映射是由使用可选参数源



 类似资料:
  • 我想知道mongoose是否有一些方法可以通过id集更新多个文档。例如: 我想知道的是,如果猫鼬能做这样的事情: 其中,ids是一个id数组,如['id1','id2','id3']-示例数组。对于find,同样的问题。

  • 问题内容: 我是python和jango rest的新手。但是我很困惑。在Django Rest框架中更新多对多关系的最佳方法是什么。我阅读了文档 http://www.django-rest-framework.org/api-guide/relations/#manytomanyfields- with-a-through-model 默认情况下,设置了以指定的贯通模型为目标的ManyToMa

  • 问题内容: 我遇到了一个mongo问题。我想知道是否有办法做一个蒙戈控制台命令而不是多个以下和电话。 我想用这个新的数组项更新对象 我使用了此方法,它是有限的,如果它已经存在,它不会将一个项目插入数组,但不会基于标识符更新项目。在这种情况下,我真的很想根据来更新此条目。 这给了我: 当我真正想要的是: 问题答案: 您可以使用位置运算符执行此操作: 的在更新对象充当的第一个元素的占位符到查询选择器相

  • 我正在为一个网站制作一个新闻块。我想如果一条新闻消息有超过64个单词,它会显示一个阅读更多按钮。如果它有少于64个单词,则只显示消息。现在我已经有了带有阅读更多按钮的部分,但是我不能得到如果它有少于64个单词,阅读更多按钮就会消失的部分。所以阅读更多按钮是可见的,无论它有少于或多于64个单词。 这是一段代码 更新: 这是我现在反应后得到的。但是内容会显示,而“阅读更多”按钮不会显示。 var_du

  • 问题内容: 我正在尝试为实体框架创建一个查询,该查询将允许我获取ID列表并更新与它们关联的字段。 SQL中的示例: 如何将以上内容转换为实体框架? 问题答案: 像下面这样 更新: 您可以如下更新多个字段

  • 在我的应用程序中,用户和首选项实体之间存在多对多关联。由于连接表需要一个额外的列,因此我必须将其分解为2个一对多的关联: 用户实体: 偏好实体: 用户首选项实体: 为了更新其中一个首选项,我循环浏览用户的一组首选项,并更新值如下: 我已经确认,我试图更新的用户变量在代码运行后确实包含新值。更奇怪的是,当重定向发生时,该值会在网页上更新,但数据库不会更新!这是我用来做更新的代码,这个类用@Trans