Djangoorm:定制一个ListView,并向它的查询添加更多信息

2024-09-28 01:23:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个视图来列出某个模型(我们称之为class A),如下所示:

class BaseListView(ListView, MultipleObjectMixin):
    http_method_names = ['get']
    order_field = None

    def get_paginate_by(self, queryset):
        session_manager = SessionManager(self.request.session)
        return session_manager.paginate_by.get()

    def get_context_data(self, **kwargs):
        context = super(BaseListView, self).get_context_data(**kwargs)

        session_manager = SessionManager(self.request.session)
        session_manager.paginate_by.set_to(context)

        return context

到目前为止,这种观点正是我们所需要的。现在我要将它检索的对象列表与另一个对象列表(class B)进行比较。在

AB的对象都有一个主键及其名称。在

我想检查class A中的任何对象是否与class B中的任何对象具有相同的name(主键)。如果B中有A的实例,我想添加一个特定的参数或类似is_in_B=True的参数。在

我需要这样做,这样我就可以在模板中以不同的方式表示A的这些实例。在

我怎么能这么做?在

这是我目前自己想出的:

^{pr2}$

我不太确定这是一个合适的方法。在

另外,我应该如何修改我的类返回的queryset,以便我可以指出class A的哪些实例与class B的任何实例共享相同的name?在


Tags: 对象实例selfgetbyrequestsessiondef
1条回答
网友
1楼 · 发布于 2024-09-28 01:23:09

您可以annotate your queryset with a conditional expression来实现这一点:

from django.db.models import Case, When, Value

def get_queryset(self):
    # This gives you the queryset of A objects
    queryset = super(AListView, self).get_queryset()
    # List of primary keys of B objects
    all_objects_B = B.objects.all().values_list('pk',flat=True)

    # modify queryset to indicate which instances of A are present in B
    return queryset.annotate(
        is_in_b=Case(When(pk__in=all_objects_B, then=Value(True)),
                       default=Value(False))
        )
    )

您的queryset对象现在将有一个is_in_b属性。在

如果B对象列表很小,这将很好地工作。如果它很大,那么我不确定它是否非常有效,您可能需要进一步开发它,看看是否可以在数据库中直接执行检查(在B中是A)(可能需要原始SQL)。在

相关问题 更多 >

    热门问题