首页 > 解决方案 > 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 和尝试列出路由时出现错误。

标签: pythondjangodjango-rest-framework

解决方案


我解决了我的问题:

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 之前丢失了。


推荐阅读