2012-01-11 26 views

cevap

10

Kısa çözüm

qs = Model.objects.filter(...) # qs with objects to exclude 
result = Model.objects.exclude(pk__in=qs.values_list('pk', flat=True)) 

Daha KURU çözüm

Ancak, mantık defalarca kullanmak istiyorsanız, bir yöntemde hapsetmek için öneririm. Size bu tamamlayıcı almak için en hassas yol vermek için, size tamamlayıcı istediğiniz zincirle QuerySet Django için yardımcı olacak

class QuerysetUtils: 
    def get_queryset_complement(self, method): 
     return self.exclude(pk__in=method().values_list('pk', flat=True)) 


class ExpirableQueryset(QuerysetUtils, models.query.QuerySet): 
    def expired(self): 
     return self.filter(expiration__lte=timezone.now()) 

    def unexpired(self): 
     return self.get_queryset_complement(self.expired) 
+2

, bunun bir alt sorgu olarak yürütüldüğünü, yani hariç tutulacak tüm kimliklerin hiçbir zaman oluşturulmadığını (aksi takdirde potansiyel bir performans vuruşu olabilir) not edin – second

+2

Bu en özlü çözüm mü? –

+0

Belki de kullanım durumunuz için daha iyi bir tane var ama daha sonra yararlı olacaktır, çünkü Cush Pratt dedi ki, bize bazı kodlar gösterebilirsiniz .... –