Исправление доступа к полям доставки после рефакторинга

- Добавлены свойства обратной совместимости в модель Order для доступа к полям доставки через связь delivery
- Исправлены фильтры по delivery_date в модели Customer (get_successful_orders_total)
- Исправлены фильтры в orders/filters.py для работы с delivery__delivery_date
- Добавлен select_related('delivery') в customer_detail view для оптимизации запросов

Исправляет ошибку FieldError: Cannot resolve keyword 'delivery_date' into field
This commit is contained in:
2025-12-24 13:35:23 +03:00
parent 94fe363cb1
commit 9f4f03e340
4 changed files with 78 additions and 11 deletions

View File

@@ -6,7 +6,7 @@
import django_filters
from django import forms
from django.db.models import Q
from .models import Order, OrderStatus
from .models import Order, OrderStatus, Delivery
class OrderFilter(django_filters.FilterSet):
@@ -31,9 +31,9 @@ class OrderFilter(django_filters.FilterSet):
})
)
# Фильтр по диапазону дат доставки
# Фильтр по диапазону дат доставки (используем delivery__delivery_date после рефакторинга)
delivery_date_after = django_filters.DateFilter(
field_name='delivery_date',
field_name='delivery__delivery_date',
lookup_expr='gte',
label='Дата доставки от',
widget=forms.DateInput(attrs={
@@ -43,7 +43,7 @@ class OrderFilter(django_filters.FilterSet):
)
delivery_date_before = django_filters.DateFilter(
field_name='delivery_date',
field_name='delivery__delivery_date',
lookup_expr='lte',
label='Дата доставки до',
widget=forms.DateInput(attrs={
@@ -127,10 +127,10 @@ class OrderFilter(django_filters.FilterSet):
def filter_delivery_type(self, queryset, name, value):
"""
Кастомный фильтр для типа доставки
Кастомный фильтр для типа доставки (используем delivery__delivery_type после рефакторинга)
"""
if value == 'delivery':
return queryset.filter(is_delivery=True)
return queryset.filter(delivery__delivery_type=Delivery.DELIVERY_TYPE_COURIER)
elif value == 'pickup':
return queryset.filter(is_delivery=False)
return queryset.filter(delivery__delivery_type=Delivery.DELIVERY_TYPE_PICKUP)
return queryset

View File

@@ -257,3 +257,70 @@ class Order(models.Model):
if hasattr(self, 'delivery'):
self.delivery.cost = 0
self.delivery.save(update_fields=['cost'])
# === Свойства обратной совместимости для доступа к полям доставки ===
# Эти свойства обеспечивают доступ к полям Delivery через Order для обратной совместимости
# после рефакторинга, когда поля доставки были перенесены в отдельную модель Delivery
@property
def delivery_date(self):
"""Дата доставки (обратная совместимость)"""
if hasattr(self, 'delivery') and self.delivery:
return self.delivery.delivery_date
return None
@property
def delivery_time_start(self):
"""Время начала доставки (обратная совместимость)"""
if hasattr(self, 'delivery') and self.delivery:
return self.delivery.time_from
return None
@property
def delivery_time_end(self):
"""Время окончания доставки (обратная совместимость)"""
if hasattr(self, 'delivery') and self.delivery:
return self.delivery.time_to
return None
@property
def delivery_time_window(self):
"""Форматированное окно времени доставки (обратная совместимость)"""
if hasattr(self, 'delivery') and self.delivery:
if self.delivery.time_from and self.delivery.time_to:
return f"{self.delivery.time_from.strftime('%H:%M')} - {self.delivery.time_to.strftime('%H:%M')}"
return None
@property
def delivery_time(self):
"""Время доставки (обратная совместимость, использует delivery_time_window)"""
return self.delivery_time_window
@property
def is_delivery(self):
"""Является ли заказ доставкой (обратная совместимость)"""
if hasattr(self, 'delivery') and self.delivery:
from .delivery import Delivery
return self.delivery.delivery_type == Delivery.DELIVERY_TYPE_COURIER
return False
@property
def delivery_address(self):
"""Адрес доставки (обратная совместимость)"""
if hasattr(self, 'delivery') and self.delivery:
return self.delivery.address
return None
@property
def delivery_cost(self):
"""Стоимость доставки (обратная совместимость)"""
if hasattr(self, 'delivery') and self.delivery:
return self.delivery.cost
return 0
@property
def pickup_warehouse(self):
"""Склад самовывоза (обратная совместимость)"""
if hasattr(self, 'delivery') and self.delivery:
return self.delivery.pickup_warehouse
return None