2013-10-17 35 views
1

我相信从问题中很难理解问题,所以我会提供一个答案。从列表中删除具有相关相关模型的对象

我与我的型号之间存在以下关系:Answer属于Question属于Page。我有一个答案列表:[<Answer: 1>, <Answer: 2>, ...]

现在我想删除全部属于不同问题的答案属于相同页面。

如果,例如,我的答案列表包含以下(细节增加了清晰度):[<Answer: Q1P1>, <Answer: Q1P1>, <Answer: Q1P2>, <Answer: Q2P2>]则只有最后2个答案应该从列表中删除,因为他们都属于属于同一个不同的问题页。前两个答案仍然存在,因为虽然他们的问题属于同一页面,但问题并无不同。

我的模型大致是这样的:

class Page(models.Model): 
    pass 

class Question(models.Model): 
    page = models.ForeignKey(Page) 

class Answer(models.Model): 
    question = models.ForeignKey(Question) 

我怎样才能做到这一点?

+0

你可以发布您的模型? – dm03514

+0

那么,如果我正确地找到了你,给了一个页面,得到所有与之相关的唯一答案?或者你想要一个具有独特的页面 - 答案关系的查询集? – karthikr

+0

你的_REAL_用例是什么?这个列表来自哪里(并且它真的是一个列表吗?或者它是一个QuerySet?)你需要什么? 如果它真的是一个列表,那么你可以使用for循环或列表集成或使用内置的'filter'函数来过滤它,但它并不是非常有效。 –

回答

1

更新2:

比方说,我们有一个answers列表。

 
# 1. Let's find out the pages: 
pages = set([]) 
for a in answers: 
pages.add(a.question.page) 
pages = list(pages) 

# 2. Now for each page, 
for p in pages: 
    # 2.a. find out the answers that belong to this page 
    same_page_answers = [a for a in answers if a.question.page = p] 
    # 2.b. find out the questions of these answers 
    same_page_questions = set([]) 
    for a in same_page_answers: 
    same_page_questions.add(a.question) 
    same_page_questions = list(same_page_questions) 

    # 3. now we will check to see if each question appears at least twice 
    for q in same_page_questions: 
    same_page_question_answers = [a for a in same_page_answers if a.question=q] 
    if len(same_page_question_answer) < 2: 
     # Ok so the same_page_question_answers need to be removed from our initial answers 
     answers = [a for a in answers if a not in same_page_question_answer] 
     # actually if we are here same_page_question_answer will be an array with 1 element but in any case 

使用你的例子

 

answers = [A1: Q1P1, A2: Q1P1, A3: Q1P2, A4: Q2P2] 

pages = [P1, P2] 

inside for loop for P1: 
same_page_answers = [A1, A2] 
same_page_questions = [Q1, Q1] 
inside for loop for Q1: 
    len == 2 - we won't remove anything 


inside for loop for P2: 
same_page_answers = [A3, A4] 
same_page_questions = [Q1, Q2] 
inside for loop for Q1: 
    same_page_question_answers = [A3] 
    len = 1 - we will remove [A3] from answers 
inside for loop for Q2: 
    same_page_question_answers = [A4] 
    len = 1 - we will remove [A4] from answers 

answers = [A1,A2] 

希望它的工作现在:)

+0

OP希望删除属于“来自同一页面的不同问题”的答案 –

+0

我没有当前页面,我只提供了答案的列表(queryset)。 – linkyndy

+0

感谢您的更新。我认为这会更容易,一些Django特定的东西,将利用这个沉重的过程。但我会走“硬”的路。再次感谢您的帮助! – linkyndy