django - 邮递员只向 Django 中的 ManyToMany 字段显示“此字段是必需的”
问题描述
我有 2 个模型 - 模块和房间。一个模块可以有零个或多个房间,一个房间可以添加到多个模块中。因此,它们之间存在简单的多对多关系。
当我使用发布请求时,原始数据有效,但表格数据无效。
模块/models.py -
class Module(models.Model):
module_id = models.AutoField(primary_key=True)
title = models.CharField(max_length=100)
desc = models.TextField()
room_list = models.CharField(max_length = 100, blank=True)
rooms = models.ManyToManyField(Rooms, blank=True)
房间/models.py -
class Rooms(models.Model):
room_id = models.AutoField(primary_key=True)
title = models.CharField(max_length=100)
level = models.CharField(max_length=100)
desc = models.TextField()
模块/serializers.py -
class ModuleSerializer(serializers.ModelSerializer):
rooms = RoomSerializer(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 = Rooms.objects.get(**data)
module.rooms.add(room)
return module
def update(self, instance, validated_data):
# Updating rooms
rooms_data = validated_data.get('rooms')
instance.rooms.clear()
for room_data in rooms_data:
room = Rooms.objects.get(**room_data)
instance.rooms.add(room)
# Updating other fields
fields = [
'title',
'desc',
'thumbnail',
'is_deleted',
]
for field in fields:
setattr(instance, field, validated_data[field])
instance.save()
return instance
房间/serialier.py -
class RoomSerialize(serializers.ModelSerializer):
room_id = serializers.IntegerField()
class Meta:
model = Rooms
fields = "__all__"
模块/views.py -
class add_module(APIView):
def post(self, request, format=None):
# Adding the rooms to module from room_list
new_request = request.data.copy()
room_list=[]
if 'room_list' in new_request:
room_list_data = list(new_request['room_list'].split(" "))
for room in room_list_data:
room_object = Rooms.objects.get(room_id=room)
room_serializer = RoomSerializer(room_object)
room_list.append(room_serializer.data)
new_request.update({'rooms':room_list})
# creating the module
module_serializer = ModuleSerializer(data=new_request)
if module_serializer.is_valid():
module_serializer.save()
return Response(module_serializer.data['module_id'])
return Response(module_serializer.errors)
在 POSTMAN 中更新模块的 POST 请求正文 -
{
"module_id": 2,
"room_list": "1 2",
"title": "4",
"desc": "22",
}
请注意,在输入 ManyToMany 字段 - “rooms”时,我将字符串“room_list”作为包含要包含的所有 room_ids 的输入。当我在邮递员中将输入作为原始数据时,这工作得很好,但是当我使用表单数据时,它显示
{
"rooms": [
"This field is required."
]
}
该怎么办?
解决方案
首先,具有 (many=True) 的序列化器字段创建嵌套对象。如果您输入的数据Rooms
已经序列化,则意味着您创建了其他Rooms
实例。它将与if module_serializer.is_valid():
部分一起显示。因此,如果您打算实现为已实例化的链接Rooms
,Module
最好将其作为主键列表。
这是我的示例代码。
class ModuleSerializer(serializers.ModelSerializer):
rooms = RoomSerializer(many=True, read_only=True)
def create(self, validated_data):
rooms_data = validated_data['room_list']
module = Module.objects.create(**validated_data)
for data in rooms_data.split(' '):
room = Rooms.objects.get(room_id=data)
module.rooms.add(room)
return module
def update(self, instance, validated_data):
# Updating rooms
rooms_data = validated_data.get('rooms')
instance.rooms.clear()
for room_data in rooms_data:
room = Rooms.objects.get(**room_data)
instance.rooms.add(room)
# Updating other fields
fields = [
'title',
'desc',
'thumbnail',
'is_deleted',
]
for field in fields:
setattr(instance, field, validated_data[field])
instance.save()
return instance
class Meta:
model = Module
fields = '__all__'
class AddModule(APIView):
def post(self, request, format=None):
# creating the module
module_serializer = ModuleSerializer(data=request.data)
if module_serializer.is_valid():
module_serializer.save()
return Response(module_serializer.data['module_id'])
return Response(module_serializer.errors)
任何其他部分都与您的相同。无论数据是通过form-data还是json原始数据发送的,结果都如下。
推荐阅读
- winforms - 与应用程序中的另一个窗口交互
- plsql - PLS-00323:子程序或光标
- mysql - 如果它只出现在指定的时间段内但从未出现过,则从 mysql 返回一条记录
- database - 仅由开发人员将数据插入数据库
- python - 如何使用python比较结果集对象中的2个连续行值
- r - 如果对输入进行过滤后行 == 0,则让闪亮的应用程序显示自定义消息而不是绘图
- javascript - 如何使用不一致的 PHP 舍入?
- php - 从重定向到购物车的自定义表中设置和使用会话数据
- sql - 如何从包含重复行的表中获取条件输出值
- excel - VBA 错误 1004 - 从 VB.Net (Visual Studio) 调用函数