【问题标题】:Transfer the QuerySet in Django AdminModel在 Django 管理模型中传输 QuerySet
【发布时间】:2021-11-03 21:59:44
【问题描述】:

我正在尝试通过我的排序引用另一个模型。

query = Cars.objects.filter(task_id__exact=obj.task_id, 
                            engine__isnull=False).values_list('engine', flat=True)
engines_ids_list=list(query)

link = reverse("admin:auto_engines_changelist") + f"?id={engines_ids_list}"
                                                               ^
                                                         Not work, it's example

?engine_id=1&engine_id=2 使用最后一个参数 (engine_id=2) 显示对象,而不是 2 个对象..

只工作Engines.objects.filter(pk__in=engines_ids_list)

如何将此过滤器发送到引擎更改列表页面?

【问题讨论】:

    标签: django django-models django-views django-admin


    【解决方案1】:

    您可以将 task_id 作为参数传递给 url。

    link = reverse("admin:auto_engines_changelist") + f"?task_id={task_id}"
    

    然后您可以访问Engines Modeladmin 的get_queryset() 方法中的{task_id} 值。

    def get_queryset(self, request):
        queryset = super().get_queryset(request)
    
        task_id = request.GET.get('task_id')
        if task_id is not None:
            engine_ids = Cars.objects.filter(task_id__exact=task_id, engine__isnull=False).values_list('engine', flat=True)
            queryset = queryset.filter(id__in=engine_ids)
        return queryset
    

    【讨论】:

    • 只有在我不指明task_id时才有效。如果我指定它,Django 会将我重定向到包含所有对象的“127.0.0.1:8000/admin/auto/engines/?e=1”。我试图找到“?e = 1”的内容,但我没有找到任何东西。同时,我检查了正确执行的代码:queryset = queryset.filter(id__in=engine_ids) print(queryset) # <QuerySet [<Engine: 1>, <Engine: 2>]> EDIT:link = reverse("admin:auto_engines_changelist") + f"?e={task_id}" with:request.GET.get('e') 为我工作,但我不明白为什么我不能拉伸你自己的变量
    • @CbrRRider django admin url 接受模型字段名称的查询参数。我认为您的 Engines 模型没有 task_id 字段。所以使用 ?e=1 参数进行 url 重定向。
    猜你喜欢
    • 2015-01-27
    • 2017-02-20
    • 2014-01-13
    • 2016-11-19
    • 1970-01-01
    • 2021-04-05
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多