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