Добавление Django-admin-action с условиями
У меня есть моя модель Django Customer
который состоит из этих полей;
"Customer_ID", "Имя", "Пол", "Возраст" , "Национальность", "Адрес", "Account_Type" , "Зарплата" , "Balance" , "Employer_Stability" , "Customer_Loyalty" , "Residential_Status" и "Service_Level" '
где Service_Level
знак равно Silver
, Gold
или же Platinum
,
Мне удалось создать пользовательское действие администратора, чтобы просто обновить Service_Level без каких-либо условий, как показано ниже;
def allocate_service(ModelAdmin, request, queryset):
queryset.update(Service_Level=2)
@admin.register(models.Customer)
class CustomerAdmin(admin.ModelAdmin):
icon = '<i class="material-icons">account_box</i>'
list_display = ('Customer_ID', 'Name', 'Gender', 'Nationality',
'Account_Type', 'Salary', 'Balance', 'Service_Level')
list_per_page = 10
list_filter = ('Nationality', 'Gender')
actions = [allocate_service ]
Я хотел бы добавить действие, которое назначает уровень Service_Level клиенту / клиентам в зависимости от значений выше выделенных жирным шрифтом (возраст, зарплата и т. Д.). например, когда Age > 25 and Salary >= 800 and Account_Type == Savings
затем Service_Level = Platinum
,
мои модели следующие:
class Service(models.Model):
#service_no = models.CharField(primary_key=True, max_length=4)
service_name = models.CharField(primary_key=True, max_length=40)
service_description = models.TextField(default='')
class Meta:
db_table = 'services'
ordering = ['service_name']
def __str__(self):
return self.service_name
# Customer Model: too big so I ommited the other fields here
class Customer(models.Model):
Service_Level = models.ForeignKey(Service, on_delete=models.CASCADE,
db_column='service_name', null=True, blank=True)
Я удалил возможность использовать ключ int на Service_Level
Я не уверен, как я должен идти об этом. Помощь будет оценена
1 ответ
Вы можете перебирать набор запросов и выполнять свои условия для каждого отдельно, вместо того, чтобы просто применять "глобальный" update
все (queryset.update(Service_Level=2)
).
from django.contrib.messages import SUCCESS
def allocate_service(modeladmin, request, queryset):
platinum_customers = []
silver_customers = []
message = ''
for customer in queryset:
if customer.Age > 25 and customer.Salary >= 800 and customer.Account_Type == 'Savings':
customer.Service_Level.service_name = 'Platinum'
platinum_customers.append(customer.name)
elif other_condition_here:
customer.Service_Level.service_name = 'Silver'
silver_customers.append(customer.name)
customer.save()
if platinum_customers:
message = 'The following customers are now platinum: {}'.format(', '.join(platinum_customers))
if silver_customers:
message = 'The following customers are now silver: {}'.format(', '.join(silver_customers))
if not platinum_customers and not silver_customers:
message = 'No customer changes!'
modeladmin.message_user(request, message, level=SUCESS)