结合上面的问题,如何在过滤后改变list_display中展示的字段,其中包括数据库没有的字段,同时改变查询内容结果
时间: 2023-12-11 18:05:19 浏览: 40
如果要在`list_display`中展示数据库没有的字段,可以使用`@property`装饰器将这些字段定义为模型的属性。然后在`list_display`中引用这些属性即可。
例如,假设你有一个`Person`模型,但是想要在`list_display`中展示该人的年龄(从生日计算得出),可以这样做:
```python
from datetime import date
class Person(models.Model):
name = models.CharField(max_length=50)
birthday = models.DateField()
@property
def age(self):
today = date.today()
return today.year - self.birthday.year - ((today.month, today.day) < (self.birthday.month, self.birthday.day))
class Meta:
verbose_name = 'person'
verbose_name_plural = 'people'
@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
list_display = ('name', 'age')
```
在这个例子中,我们定义了一个`age`属性,它通过计算生日和当前日期来计算该人的年龄。然后我们在`PersonAdmin`的`list_display`中引用了这个属性。
如果你想改变查询内容结果,可以使用`ModelAdmin`的`get_queryset`方法。你可以在这个方法中对原始查询集进行过滤、排序、分组等操作,然后返回一个新的查询集。
例如,假设你只想查询年龄大于等于18岁的人,可以这样做:
```python
@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
list_display = ('name', 'age')
def get_queryset(self, request):
qs = super().get_queryset(request)
today = date.today()
adult_age = today.year - 18 - ((today.month, today.day) < (self.birthday.month, self.birthday.day))
return qs.filter(birthday__lte=date(today.year - adult_age, today.month, today.day))
```
在这个例子中,我们在`get_queryset`方法中计算出当前年龄大于等于18岁的日期,然后使用`filter`方法过滤出生日在这个日期之前的人。然后我们返回这个新的查询集。
相关推荐
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)