django - 如何使用更新函数在嵌套序列化程序 Django 中添加或删除对象
问题描述
我有 2 个模型 - 模块和房间。一个模块可以有零个或多个房间,一个房间可以添加到多个模块中。因此,它们之间存在简单的多对多关系。
在使用 put 请求更新模块字段时,我不想更新其中的任何房间,我只想在模块中添加/删除房间。这是我的文件-
模块/models.py -
class Module(models.Model):
module_id = models.AutoField(primary_key=True)
title = models.CharField(max_length=100)
desc = models.TextField()
rooms = models.ManyToManyField(Rooms)
房间/models.py -
class Rooms(models.Model):
room_id = models.AutoField(primary_key=True)
title = models.CharField(max_length=100)
desc = models.TextField()
level = models.CharField(max_length=100)
is_deleted = models.BooleanField(default=False)
模块/serializers.py -
class ModuleSerializer(serializers.ModelSerializer):
rooms = RoomSerializer(read_only=True, many=True)
class Meta:
model = Module
fields = "__all__"
def create(self, validated_data):
rooms_data = validated_data.pop('rooms')
module = Module.objects.create(**validated_data)
for data in rooms_data:
room, created = Rooms.objects.get_or_create(**data)
module.rooms.add(room)
return module
房间/serialier.py -
class RoomSerializerWrite(serializers.ModelSerializer):
room_id = serializers.IntegerField()
class Meta:
model = Rooms
fields = "__all__"
模块/views.py -
class add_module(APIView):
def post(self, request, format=None):
module_serializer = ModuleSerializer(data=request.data)
if module_serializer.is_valid():
module_serializer.save()
return Response(module_serializer.data['module_id'], status = status.HTTP_201_CREATED)
return Response(module_serializer.errors, status = status.HTTP_400_BAD_REQUEST)
在 POSTMAN 中更新模块的 POST 请求正文 -
{
"module_id": 2,
"rooms": [
{
"room_id": 2,
"title": "4",
"desc": "22",
"level": "2",
}
],
"title": "4",
"desc": "22",
}
有人可以帮助我使用模块/序列化器中的更新功能吗?
解决方案
我的理解是您不想用帖子正文更新模块的房间,实际上您想替换它们。因此,只需从 m2m 关系中清除每个房间并根据请求添加新房间。就像是;
def update(self, instance, validated_data):
# get new rooms
rooms_data = validated_data.get('rooms')
# clear m2m relationship
instance.rooms_set.clear()
# I assume your rooms_data is a list that contains dicts with room fields
for room_data in rooms_data:
# get room instance
room, created = Rooms.objects.get_or_create(**room_data)
# Add it to m2m relationship
instance.rooms.add(room)
instance.save()
return instance
因此,如果您不将现有房间发送到您的序列化程序,它将在实例上从 m2m 关系中删除。
推荐阅读
- linux - 如何检查包含变量的字符串是否存在于 bash 的特定文件中?
- html - 使 div 滚动而不是扩展以适应其内容
- sas - 在 Aginity 上将 sas 文件加载到 netezza
- sql - 需要帮助 - 创建触发器以更新列
- sharepoint - 在一个 SharePoint 上开发 SharePoint Web 部件,但将部署在完全不同的一个上
- wildfly - 迁移期间的 EAP 7.X ClassNotFoundException
- excel - 根据工作表名称自动向各个收件人发送电子邮件
- python - 如何使用python通过FT上传许多文件?
- twitter-bootstrap - 悬停内部对象时如何删除工具提示?
- if-statement - 在时序收敛、多个“ifs”或“if-else”方面哪个更快?