django admin 为计算字段启用排序

在Django中,如果你想为计算字段(即没有直接对应数据库列的字段)启用排序功能,你可以使用Django的`@property`装饰器以及Django的admin自定义过滤器来实现。以下是一般步骤和代码示例:

### 1. 为模型添加属性

```python
# models.py
from django.db import models

class YourModel(models.Model):
    field1 = models.CharField(max_length=100)
    field2 = models.IntegerField()

    @property  # 使用@property装饰器声明一个属性
    def computed_field(self):
        return self.field1 + str(self.field2)  # 这里是计算字段的逻辑

    class Meta:
        ordering = ['computed_field']  # 默认排序字段,如果需要自定义排序,可以在这里定义
```

### 2. 在admin中注册模型并添加排序选项

```python
# admin.py
from django.contrib import admin
from .models import YourModel

@admin.register(YourModel)
class YourModelAdmin(admin.ModelAdmin):
    list_display = ['field1', 'field2', 'computed_field']  # 在列表显示字段中包含计算字段
    search_fields = ['field1', 'field2', 'computed_field']  # 搜索框中包含计算字段
    ordering = ['computed_field']  # 默认排序字段

    # 如果需要在admin界面对计算字段进行自定义排序,可以使用CustomSortFilter
    class Media:
        js = ('admin/js/jquery.init.js',)  # 加载jQuery库
    
    def get_queryset(self, request):
        queryset = super().get_queryset(request)
        return queryset.order_by('computed_field')

# 自定义排序过滤器
from django import forms
from django.db.models import Q

class CustomSortFilter(admin.SimpleListFilter):
    title = 'Computed Field'  # 显示名称
    parameter_name = 'computed_filter'  # URL参数名称

    def lookups(self, request, model_admin):
        return (
            ('asc', 'Ascending'),
            ('desc', 'Descending'),
        )

    def queryset(self, request, queryset):
        if self.value() == 'asc':
            return queryset.order_by('computed_field')
        elif self.value() == 'desc':
            return queryset.order_by('-computed_field')

    def choices(self, cl):
        choices = super().choices(cl)
        # 添加一个空的选项,以便用户可以取消排序
        choices.insert(0, ('', '---------'))
        return choices

YourModelAdmin.list_filter = (CustomSortFilter,)  # 注册自定义过滤器到admin界面
```

### 测试用例

假设你有一个模型`User`,其中包含两个字段`first_name`和`last_name`,以及一个计算字段`full_name`。你可能希望在admin页面上按照这个计算字段进行排序。

```python
class User(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)

    @property
    def full_name(self):
        return f'{self.first_name} {self.last_name}'

@admin.register(User)
class UserAdmin(admin.ModelAdmin):
    list_display = ['first_name', 'last_name', 'full_name']
    search_fields = ['first_name', 'last_name', 'full_name']
    ordering = ['full_name']  # 默认按照full_name字段排序

    class Media:
        js = ('admin/js/jquery.init.js',)

    def get_queryset(self, request):
        queryset = super().get_queryset(request)
        return queryset.order_by('full_name')
```

以上代码首先定义了一个计算字段`full_name`,然后在admin界面中注册了这个字段,并允许用户按照它进行排序。

### 人工智能大模型应用场景和示例

在人工智能大模型的应用中,一个常见的使用场景是文本生成任务。例如,你有一个AI模型可以接受一段文本作为输入,然后根据这个输入生成相关的文本输出。你可以创建一个Django模型来表示这个输入输出对,然后在admin界面中展示这些输入输出。

```python
class TextGeneration(models.Model):
    input_text = models.TextField()
    generated_text = models.TextField()

@admin.register(TextGeneration)
class TextGenerationAdmin(admin.ModelAdmin):
    list_display = ['input_text', 'generated_text']
    search_fields = ['input_text', 'generated_text']
```

在这个例子中,你可以在admin界面上查看和搜索已经生成的文本,以及输入的文本。这样可以帮助模型开发者快速审查生成的文本的质量。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潮易

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值