2016-04-25 18 views
1

我有一個看法列出某個模型(可以稱之爲class A),就像這樣:Django的ORM:自定義的ListView,和更多的信息,其查詢集添加

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的實例。

我該怎麼做?

這是我想出了用自己的時刻:

class AListView(BaseListView): 
    model = "A" 

    def get_queryset(self): 
     queryset = super(AListView, self). get_query_set() 

     all_objects_A = A.objects.all() 
     all_objects_B = B.objects.all() 

     # modify queryset to indicate which instances of A are present in B 
     # No idea how to do this 

     return queryset 

我真的不知道這是一個適當的做法。

而且,我怎麼修改我的類返回,這樣我可以指示class A共享相同的name任何的class B實例的哪些實例的queryset

+0

「A」和「B」有關係嗎? – Sayse

+0

'A'的主鍵是字段'name'(例如:「John Doe」)。 'B'的主鍵也是它的字段'name'(例如'Jane Doe'),所以我想要知道'B'對象列表中是否存在任何「John Doe」並返回查詢集中的那些信息。 – Xar

回答

1

可以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)) 
     ) 
    ) 

你查詢集對象現在有一個is_in_b財產。

如果您的B對象列表很小,這將工作正常。如果它很大,那麼我不確定它是否非常有效,並且您可能需要進一步開發它以查看是否可以直接在數據庫中完成檢查(可能需要原始SQL)。

+0

完美!非常感謝@solarissmoke – Xar