我在postgreSQL中的两个模型之间有一个简单的Django ForeignKey关系。这里的逻辑是Sample对象可以选择在一种类型的示例控件中具有外键。
from django.contrib.postgres.fields import CICharField
from django.db import models
class Sample(models.Model):
controls_applied = models.ForeignKey(SampleControl, null=True,
blank=True,
on_delete=models.SET_NULL)
class SampleControl(models.Model):
id = CICharField(max_length=200, primary_key=True)
在Sample的管理更改列表中,我正试图创建一个过滤器,该过滤器查询所有或没有特定控件的Samples(在这种情况下,我们将使用id为"uncontrol"的SampleControl(。我正在尝试创建一个特定的URI字符串,以附加到我的变更列表url中,因为我正在尝试与其他过滤器一起运行。
要使用controls_applied= 'runcontrol'
获取所有样本,我可以简单地将以下字符串附加到我的URL(注意对外键id的引用(:
?controls_applied__id=runcontrol
但如果我想得到所有不是运行控制的样本,那就更复杂了。我不知道该怎么办,所以我决定使用"启动开关",它有一个方便的"不启动开关"伴侣,可以做相反的事情。当我使用这个时,我看到以下工作:
?controls_applied__id__startswith=runcontrol
然而,反
?controls_applied__id__notstartswith=runcontrol
给我一个错误:Unsupported lookup 'notstartswith' for CICharField or join on the field not permitted, perhaps you meant startswith or istartswith?
这就引出了一个简单的问题:有没有办法在Django的管理网站上的URL查询字符串中指定NOT EQUALS?非常感谢。
我不认为管理员URL能够表示exclude
查询集过滤器,除非您创建自己的SimpleListFilter
。
在你的管理员中试试这个.py:
class WithoutControlListFilter(admin.SimpleListFilter):
title = ('Without Control')
parameter_name = 'without_control'
def lookups(self, request, model_admin):
return (
('runcontrol', ('Run Control')),
)
def queryset(self, request, queryset):
return queryset.exclude(controls_applied=self.value())
class SampleAdmin(admin.ModelAdmin):
list_filter = (WithoutControlListFilter,)
Django ModelAdmin文档中有一些关于管理过滤器的信息。