使用 F() 表达式的 Django 管理过滤器

标签 django filter admin

有人知道如何根据模型字段的比较 - F() 表达式在管理员中进行过滤吗?

假设我们有以下模型:

class Transport(models.Model):
    start_area = models.ForeignKey(Area, related_name='starting_transports')
    finish_area = models.ForeignKey(Area, related_name='finishing_transports')

现在,我想做的是制作管理过滤器,它允许过滤区域内和跨区域对象,其中区域内是那些,其 start_area 和 finish_area 相同,而 trans-area 是其他对象。

我试图通过创建自定义 FilterSpec 来实现这一点,但有两个问题:
  • FilterSpec 只绑定(bind)到一个字段。
  • FilterSpec 不支持 F() 表达式和排除。

  • 第二个问题可以通过定义自定义 ChangeList 类来解决,但我认为没有办法解决第一个问题。

    我还尝试通过重载 queryset 方法并将额外的上下文发送到更改列表模板直接在 ModelAdmin 实例中“模拟”过滤器,其中过滤器本身将被硬编码和手动打印。不幸的是,似乎存在问题,Django 取出我的 GET 参数(用于过滤器链接),因为它们对 ModelAdmin 实例是未知的,相反,它只放置了 ?e=1 ,这应该表示一些错误。

    提前感谢任何人。

    编辑 : 似乎计划在下一个 Django 版本中实现该功能,请参阅 http://code.djangoproject.com/ticket/5833 .不过,有人知道如何在 Django 1.2 中实现这一点吗?

    最佳答案

    这不是最好的方法*,但它应该有效

    class TransportForm(forms.ModelForm):
        transports = Transport.objects.all()
        list = []
        for t in transports:
            if t.start_area.pk == t.finish_area.pk:
                list.append(t.pk)
        select = forms.ModelChoiceField(queryset=Page.objects.filter(pk__in=list))
    
        class Meta:
            model = Transport
    

    关于使用 F() 表达式的 Django 管理过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4265713/

    相关文章:

    Django Rest Framework 不会同时显示多个 URL?

    javascript - 从 API 端点过滤对象数组

    python - 在 python 中使用 subprocess.run 以管理员身份运行进程

    python - 如何在 Django 管理中隐藏(而不是禁用)ModelAdmin ListView 中的操作添加模型按钮?

    javascript - 在 Javascript 变量中加载 django 自定义标签

    python - Django 请求之间的共享对象

    Django 捕获 NoReverseMatch - TemplateSyntaxError

    mysql - Web 应用程序中具有多个因素的动态搜索过滤器

    java - spring中如何只过滤特定的查询日志(logback.xml)

    passwords - 更改 WSO2 DAS 上的默认管理员密码