0

我有我的 django 模型Customer,它由这些字段组成;

'Customer_ID'、'姓名'、'性别'、'年龄', '国籍', '地址','帐户类型','薪水','平衡','Employer_Stability','客户忠诚度','居留身份'“服务级别”

其中Service_Level=或. Silver_GoldPlatinum

我已经设法创建了一个自定义管理操作来仅更新 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)

我删除了在 Service_Level 上使用 int 键的选项

我不确定我应该如何去做。帮助将不胜感激

4

1 回答 1

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)
于 2017-04-17T07:00:24.483 回答