python - TypeError:“RelatedManager”对象不可迭代 - serializers.ListField()
问题描述
我有这 2 个模型:Route 和 Order。如您所见,Route 与 Order 有关系 oneToMany:
class Order(models.Model):
customer = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='customer')
retailer = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='retailer')
date_publish = models.DateField(default=datetime.date.today)
date_available = models.DateField()
weight = models.DecimalField(decimal_places=2, max_digits=5)
description = models.CharField(max_length=500, null=True)
route = models.ForeignKey(Route, related_name='orders', null=True, on_delete=models.CASCADE)
class Route(models.Model):
day = models.DateField()
warehouse = models.ForeignKey(Warehouse, on_delete=models.CASCADE)
start_time = models.TimeField()
创建订单时,其路线应为空。创建路线时,我想将订单与创建的路线相关联,因此我有以下路线序列化程序。
class routeSerializer(serializers.ModelSerializer):
orders = serializers.ListField()
class Meta:
model = Route
fields = ['day', 'warehouse', 'start_time', 'orders']
def create(self, validated_data):
keys_to_extract = ['day', 'warehouse', 'start_time']
route_subset = {key: validated_data[key] for key in keys_to_extract}
print(validated_data)
route = Route.objects.create(**route_subset)
for order_data in validated_data['orders']:
Order.objects.filter(id=order_data).update(route=route)
return route
请求的正文应该是这样的:
{
"day" : "2021-12-12",
"warehouse": "1",
"start_time": "7:00",
"orders": [
1,2,3,4,5,6,7
]
}
我以不同的方式执行此操作,但有人告诉我以这种方式执行此操作,但使用 orders = serializers.PrimaryKeyRelatedField()。但是这样我就不能从validated_data中得到'orders',因为它只是带有'day'、'warehouse'和'start_time',所以我尝试使用serializers.ListField()。现在validated_data 具有Orders 主键列表,并且Order.objects.filter(id=order_data).update(route=route) 更新了orders 实例,但是TypeError: 'RelatedManager' object is not iterable
当我创建Route 和尝试列出路由时出现错误。
解决方案
我解决了我的问题:
class routeSerializer(serializers.ModelSerializer):
orders = serializers.PrimaryKeyRelatedField(many=True, read_only=False, queryset=Order.objects.all())
class Meta:
model = Route
fields = ['day', 'warehouse', 'start_time', 'orders']
def create(self, validated_data):
keys_to_extract = ['day', 'warehouse', 'start_time']
route_subset = {key: validated_data[key] for key in keys_to_extract}
route = Route.objects.create(**route_subset)
for order_data in validated_data['orders']:
Order.objects.filter(id=order_data.id).update(route=route)
return route
我回来了,serializers.PrimaryKeyRelatedField
但 query_set 之前丢失了。
推荐阅读
- vba - 如何在运行宏后保留选定的表格单元格?
- git - Git“祖先参考”
- c++ - 如果参数是位域,则禁用模板函数
- python - ImportError:没有名为“flask”的模块 python3 ubuntu 16.04
- javascript - JS 正则表达式匹配两种可能的组合
- c# - 下载和缓存离线数据(图像/视频/3d 模型)的代码架构应该是什么?
- haskell - 在 Haskell 中实例化 Num 类
- amazon-web-services - 如果我使用 COPY 命令将数据从 S3 加载到 Redshift,它会遵循我的 dist 样式和键吗?
- sql-server - Azure Sql 表分区性能
- php - Laravel5.2:按用户时区发送队列电子邮件?