python - django admin - list_filter 中的子查询
问题描述
给出了以下模型
class Report(models.Model):
id = models.CharField(max_length=256, unique=True)
name = models.CharField(max_length=256)
confidential = models.BooleanField(default=False)
class Owner(models.Model):
first_name = models.CharField(max_length=512)
last_name = models.CharField(max_length=512)
title = models.CharField(max_length=512)
birth_date = models.CharField(max_length=512)
company = models.CharField(max_length=512)
address = models.CharField(max_length=512)
city = models.CharField(max_length=512)
last_login = models.DateTimeField(auto_now=True)
access_granted = models.DateTimeField(auto_now_add=True)
report = models.ForeignKey(Report, on_delete=models.CASCADE)
以及来自 django 的以下 admin.py
class OwnerAdmin(admin.ModelAdmin):
.
.
.
list_filter = ('report__name',)
正如预期的那样,我可以选择根据报告的名称进行过滤。然而,如果报告是机密的,我只想显示过滤器,这意味着confidential
给定报告的字段是真实的。我怎样才能做到这一点?
解决方案
如果我正确理解您的问题,您只想在 list_filter 中列出机密报告。为此,您需要创建一个自定义过滤器:
class ReportListFilter(admin.SimpleListFilter):
title = 'Confidential Reports'
parameter_name = 'confidential_reports'
def lookups(self, request, model_admin):
confidential_reports = Report.objects.filter(confidential=True)
return tuple(
(report.id, report.name) for report in confidential_reports
)
def queryset(self, request, queryset):
if self.value()
return queryset.filter(report_id=self.value())
return queryset.all()
要理解上述内容,您可以在docs中阅读更多相关信息,但总结如下:
title
: 给出过滤器的标题parameter_name
: 给出使用过滤器时将在 URL 中使用的字符串lookups
返回给出过滤器值的元组列表queryset
是什么实际过滤。
然后你只需要将它添加到你的OwnerAdmin
,一切都应该工作:
class OwnerAdmin(admin.ModelAdmin):
.
.
.
list_filter = (ReportListFilter,)
推荐阅读
- database - Oracle:加入 2 个结果集
- gridview - Flutter:在 GridView 的平铺中使用 GestureDetector 进行点击延迟
- php - google api,具有指定标签的共享联系人
- applescript - Apple脚本将系统偏好设置窗格置于前面
- php - 如何在 x-mailer 中添加附件?
- keycloak - Keycloak:我可以在决定阻止用户时考虑帐户 IP 地址吗?
- git - 进行全局设置时,Git 不会在 HOME 目录中查找 .gitconfig
- c# - C# 使用 JObject.Parse 解析 JSON 以忽略丢失的字段
- python - 姜戈。创建作为相关模型中现有字段的副本的字段。
- php - pdo_sqlsrv:如何识别 fetch "false" 是错误还是空记录集?