【问题标题】:Django admin model query url string on NOT EQUALS不等于的 Django 管理模型查询 url 字符串
【发布时间】:2021-09-05 14:06:24
【问题描述】:

我在 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='runco​​ntrol' 的 SampleControl)。我正在尝试制作特定的 URI 字符串以附加到我的更改列表 url,因为我有其他过滤器正在尝试一起运行。

要获取带有controls_applied= 'runcontrol' 的所有示例,我可以简单地将以下字符串附加到我的 URL(注意对外键 id 的引用):

?controls_applied__id=runcontrol

但如果我想获得所有不受运行控制的样本,那就更复杂了。不知道该怎么做,所以我决定使用“startswith”,它有一个方便的“notstartswith”伴侣,可以做相反的事情。当我使用它时,我看到以下工作:

?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?谢谢!

【问题讨论】:

    标签: python django url django-views django-admin


    【解决方案1】:

    我认为管理员 URL 不能代表 exclude 查询集过滤器,除非您创建自己的 SimpleListFilter

    在你的 admin.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 docs 中有一些关于管理过滤器的信息。

    【讨论】:

    • 所以我遇到的这种方法的唯一问题是在我的 list_filters 字段中,我使用的是“元组,其中第一个元素是字段名称,第二个元素是继承的类来自我所有其他过滤器的 django.contrib.admin.FieldListFilter" 方法。有没有办法以这种元组形式使用这些自定义 SimpleListFilters?
    • @HugoKitano 您需要创建自己的继承自FieldListFilter。它会更灵活,但我看过source code,它们也更复杂。
    猜你喜欢
    • 2020-06-10
    • 2017-03-28
    • 1970-01-01
    • 2015-04-03
    • 2017-07-17
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多