From 95b7f44105906ed2884c56d91a0a7d935e340630 Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Sun, 9 Nov 2025 00:21:39 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20ForeignKey=20=D0=BF=D0=BE=D0=BB=D0=B5=D0=B9=20?= =?UTF-8?q?=D0=B2=20DraftOrderService?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавлена правильная обработка ForeignKey полей (customer, delivery_address, pickup_shop) при обновлении черновика. Теперь ID конвертируются в объекты моделей перед присваиванием. Исправляет ошибку: Cannot assign "1": "Order.customer" must be a "Customer" instance. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- myproject/orders/services/draft_service.py | 30 +++++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/myproject/orders/services/draft_service.py b/myproject/orders/services/draft_service.py index c3b989f..5eb8088 100644 --- a/myproject/orders/services/draft_service.py +++ b/myproject/orders/services/draft_service.py @@ -82,15 +82,37 @@ class DraftOrderService: raise ValidationError("Можно обновлять только черновики заказов") # Обновляем только переданные поля - updatable_fields = [ - 'customer', 'is_delivery', 'delivery_address', 'pickup_shop', - 'delivery_date', 'delivery_time_start', 'delivery_time_end', + # ForeignKey поля требуют специальной обработки + fk_fields = { + 'customer': 'customers.Customer', + 'delivery_address': 'customers.Address', + 'pickup_shop': 'shops.Shop', + } + + simple_fields = [ + 'is_delivery', 'delivery_date', 'delivery_time_start', 'delivery_time_end', 'delivery_cost', 'payment_method', 'customer_is_recipient', 'recipient_name', 'recipient_phone', 'is_anonymous', 'special_instructions', 'discount_amount' ] - for field in updatable_fields: + # Обрабатываем ForeignKey поля + for field_name, model_path in fk_fields.items(): + if field_name in data and data[field_name]: + # Получаем модель + app_label, model_name = model_path.split('.') + from django.apps import apps + Model = apps.get_model(app_label, model_name) + + # Получаем объект по ID + try: + instance = Model.objects.get(pk=data[field_name]) + setattr(order, field_name, instance) + except Model.DoesNotExist: + pass # Игнорируем несуществующие объекты + + # Обрабатываем простые поля + for field in simple_fields: if field in data: setattr(order, field, data[field])