【问题标题】:TypeError: 'RelatedManager' object is not iterable - serializers.ListField()TypeError:“RelatedManager”对象不可迭代 - serializers.ListField()
【发布时间】:2021-08-08 15:38:37
【问题描述】:

我有这 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()

创建订单时,其路线应为空。创建路由时,我想将订单与创建的路由相关联,因此我有以下 Route Serializer。

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 当我创建路线和尝试列出路线时。

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    我解决了我的问题:

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

    【讨论】:

      猜你喜欢
      • 2011-09-12
      • 1970-01-01
      • 2011-10-05
      • 2013-09-01
      • 2017-08-27
      • 2018-10-10
      • 2021-12-13
      • 2019-02-20
      • 2020-03-27
      相关资源
      最近更新 更多