Сортировка объектов в админпанели django на основе поля charfield, которое также содержит определенные символы, такие как $, евросимвол, запятая и т.д.,
В панели администратора Django мне нужна функциональность для администратора, которая позволяет ему сортировать автомобили по цене. Здесь цена является CharField
и содержит различные символы, кроме цифр в строковом формате. что затрудняет сортировку.
Я хочу отфильтровать автомобили по цене, но цена является строкой и содержит такие символы, как $, запятая и символы евро. Я не понимаю, как это отфильтровать.
class MostExpensiveCars(admin.SimpleListFilter):
title = _("Most Expensive Cars")
parameter_name = "most_expensive_cars"
def lookups(self, request, model_admin):
return (
("today", _("Today")),
("yesterday", _("Yesterday")),
("this_week", _("This Week")),
)
def queryset(self, request, queryset):
if self.value() == "today":
# get today's date
today = datetime.today().date()
# get the most expensive cars sold today
queryset = queryset.filter(sold_on=today)
if self.value() == "yesterday":
# get yesterday's date
yesterday = datetime.today().date() - timedelta(days=1)
queryset = queryset.filter(sold_on=yesterday)
# get the most expensive cars sold yesterday
# return queryset
if self.value() == "this_week":
# get the most expensive cars sold this week
seven_days_ago = datetime.today().date() - timedelta(days=7)
queryset = queryset.filter(sold_on__gte=seven_days_ago)
# TODO: code to filter queryset by price since the price is a string
# and contains many characters like $, commas, etc.
...........
@admin.register(Car)
class CarAdmin(admin.ModelAdmin):
list_display = [
"id",
"title",
"photo",
"price",
.......
]
list_filter = [
MostExpensiveCars,
"status",
"make",
"interior_color",
"exterior_color",
"transmission",
.........
]
До сих пор я пробовал решение с помощью Chat GPT, которое дает синтаксическую ошибку -
from django.db.models import F
from django.db.models.functions import Cast
from django.db.models import IntegerField
queryset = queryset.annotate(price_int=Cast(F('price').replace(',',''), output_field=IntegerField()))
return queryset