TypeError: объект 'RelatedManager' не является итерируемым - serializers.ListField()

У меня есть 2 модели: Маршрут и Заказ. Route имеет отношение oneToMany с Order, как вы можете видеть:

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, так как они приходят только с 'day', 'warehouse' и 'start_time', поэтому я попробовал использовать serializers.ListField(). Теперь в validated_data есть список первичных ключей Orders и Order.objects.filter(id=order_data).update(route=route) обновляет экземпляры заказов, но я получаю ошибку TypeError: 'RelatedManager' object is not iterable. когда я создаю маршрут и когда я пытаюсь составить список маршрутов.

Я решил свою проблему:

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 отсутствовал ранее.

Вернуться на верх