2017-03-15 35 views
0

我需要在django rest框架過濾器中過濾一些數據。我有模型:返回過濾對象(列表或查詢集)

class A(models.Model): 
    ... 
    connections = models.ManyToManyField(classB) 
    .... 


class B(models.Model): 
    ... 
    date_added=models.DateTimeField() 
    .... 

我需要使用過濾的連接返回classA對象。

例如,classA對象與不同的date_added字段具有多個連接。我需要返回classA具有連接的對象,但連接應僅從指定日期開始。

CLASSA對象可以包含不同的連接,但是,如果它已經從一個指定的日期的連接時,我需要從CLASSA返回對象,包含滿足條件,不含其不能滿足該條件的連接的連接。

有沒有辦法做到這一點?

回答

1

你可以試試這個:

A.objects.filter(connections__date_added=your_datetime) 
+0

該查詢集將返回所有具有至少一個滿足指定條件的連接的'classA'對象。那麼'classA'對象也可以具有不符合條件的'connections'。我必須返回所有具有至少一個符合指定條件的連接的'classA'對象,但沒有不符合條件的'connections'。 – szymon

0

首先獲得所有B類對象的查詢集給定日期。 然後對與該日期相關的所有連接進行反向查找。然後檢查是否是多對多集合有任何其他連接=原來的給定的日期,如果不是再加入A類對象的列表:

# queryset of all B objects for a specific date 
b_queryset = B.objects.filter(date_added__date=my_datetime_date) 

# Empty list to place all related A objects 
a_list_initial = [] 

for x in b_queryset: 
    # Add all related class A objects to a list 
    [a_list_initial.append(y) for y in x.connections_set.all()] 

# Empty list to finally place only desired A objects 
desired_a_objects = []  
for z in a_list_initial: 
    checker = all(item.date_added__date == my_datetime_date for item in z.connections.all()) 
    if checker == True: 
     desired_a_objects.append(z) 

它不漂亮,但它會實現你在找什麼爲:) 對所有的編輯,這一個是一個有點彎曲的頭腦。