我是python和django休息的新手.但我很困惑.在django rest框架中更新多对多关系的最佳方法是什么.我阅读了文档 http://www.django-rest-framework.org/api-guide/relations/#manytomanyfields-with-a-through-model 默认情况下,设置以指定的直通模型为目标的ManyToManyField的关系字段只读.
如果使用直通模型显式指定指向ManyToManyField的关系字段,请确保将read_only设置为True.
所以,如果我有一个代码
class Master(models.Model):
# other fields
skills = models.ManyToManyField(Skill)
class MasterSerializer(serializers.ModelSerializer):
skills = SkillSerializer(many=True, read_only=False)
Run Code Online (Sandbox Code Playgroud)
这将返回作为对象列表的技能.我没有办法更新它们.据我所知,当涉及到M2M时,Django更喜欢使用对象和对象id.如果我使用yii或rails,我将使用"直通"模型.我想获得skill_ids字段.我可以读写.我可以这样做写操作
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
Run Code Online (Sandbox Code Playgroud)
但我不能让它返回技能领域.并为读写操作工作.