Исправление доступа к полям доставки после рефакторинга
- Добавлены свойства обратной совместимости в модель 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:
@@ -270,11 +270,11 @@ class Customer(models.Model):
|
|||||||
# Базовый queryset: только успешные заказы
|
# Базовый queryset: только успешные заказы
|
||||||
queryset = self.orders.filter(status__is_positive_end=True)
|
queryset = self.orders.filter(status__is_positive_end=True)
|
||||||
|
|
||||||
# Фильтрация по датам (используем delivery_date)
|
# Фильтрация по датам (используем delivery__delivery_date после рефакторинга)
|
||||||
if start_date:
|
if start_date:
|
||||||
queryset = queryset.filter(delivery_date__gte=start_date)
|
queryset = queryset.filter(delivery__delivery_date__gte=start_date)
|
||||||
if end_date:
|
if end_date:
|
||||||
queryset = queryset.filter(delivery_date__lte=end_date)
|
queryset = queryset.filter(delivery__delivery_date__lte=end_date)
|
||||||
|
|
||||||
# Агрегация суммы
|
# Агрегация суммы
|
||||||
result = queryset.aggregate(
|
result = queryset.aggregate(
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ def customer_detail(request, pk):
|
|||||||
).select_related('order', 'created_by').order_by('-created_at')[:20]
|
).select_related('order', 'created_by').order_by('-created_at')[:20]
|
||||||
|
|
||||||
# История заказов с пагинацией и оптимизацией запросов
|
# История заказов с пагинацией и оптимизацией запросов
|
||||||
orders_list = customer.orders.select_related('status').order_by('-created_at')
|
orders_list = customer.orders.select_related('status', 'delivery').order_by('-created_at')
|
||||||
paginator = Paginator(orders_list, 10) # 10 заказов на страницу
|
paginator = Paginator(orders_list, 10) # 10 заказов на страницу
|
||||||
page_number = request.GET.get('page')
|
page_number = request.GET.get('page')
|
||||||
orders_page = paginator.get_page(page_number)
|
orders_page = paginator.get_page(page_number)
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
import django_filters
|
import django_filters
|
||||||
from django import forms
|
from django import forms
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from .models import Order, OrderStatus
|
from .models import Order, OrderStatus, Delivery
|
||||||
|
|
||||||
|
|
||||||
class OrderFilter(django_filters.FilterSet):
|
class OrderFilter(django_filters.FilterSet):
|
||||||
@@ -31,9 +31,9 @@ class OrderFilter(django_filters.FilterSet):
|
|||||||
})
|
})
|
||||||
)
|
)
|
||||||
|
|
||||||
# Фильтр по диапазону дат доставки
|
# Фильтр по диапазону дат доставки (используем delivery__delivery_date после рефакторинга)
|
||||||
delivery_date_after = django_filters.DateFilter(
|
delivery_date_after = django_filters.DateFilter(
|
||||||
field_name='delivery_date',
|
field_name='delivery__delivery_date',
|
||||||
lookup_expr='gte',
|
lookup_expr='gte',
|
||||||
label='Дата доставки от',
|
label='Дата доставки от',
|
||||||
widget=forms.DateInput(attrs={
|
widget=forms.DateInput(attrs={
|
||||||
@@ -43,7 +43,7 @@ class OrderFilter(django_filters.FilterSet):
|
|||||||
)
|
)
|
||||||
|
|
||||||
delivery_date_before = django_filters.DateFilter(
|
delivery_date_before = django_filters.DateFilter(
|
||||||
field_name='delivery_date',
|
field_name='delivery__delivery_date',
|
||||||
lookup_expr='lte',
|
lookup_expr='lte',
|
||||||
label='Дата доставки до',
|
label='Дата доставки до',
|
||||||
widget=forms.DateInput(attrs={
|
widget=forms.DateInput(attrs={
|
||||||
@@ -127,10 +127,10 @@ class OrderFilter(django_filters.FilterSet):
|
|||||||
|
|
||||||
def filter_delivery_type(self, queryset, name, value):
|
def filter_delivery_type(self, queryset, name, value):
|
||||||
"""
|
"""
|
||||||
Кастомный фильтр для типа доставки
|
Кастомный фильтр для типа доставки (используем delivery__delivery_type после рефакторинга)
|
||||||
"""
|
"""
|
||||||
if value == 'delivery':
|
if value == 'delivery':
|
||||||
return queryset.filter(is_delivery=True)
|
return queryset.filter(delivery__delivery_type=Delivery.DELIVERY_TYPE_COURIER)
|
||||||
elif value == 'pickup':
|
elif value == 'pickup':
|
||||||
return queryset.filter(is_delivery=False)
|
return queryset.filter(delivery__delivery_type=Delivery.DELIVERY_TYPE_PICKUP)
|
||||||
return queryset
|
return queryset
|
||||||
|
|||||||
@@ -257,3 +257,70 @@ class Order(models.Model):
|
|||||||
if hasattr(self, 'delivery'):
|
if hasattr(self, 'delivery'):
|
||||||
self.delivery.cost = 0
|
self.delivery.cost = 0
|
||||||
self.delivery.save(update_fields=['cost'])
|
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
|
||||||
|
|||||||
Reference in New Issue
Block a user