2016-11-17 74 views
0

所以我有一個表格,其中用戶可以發佈Parent細節還爲不同模型的孩子形式。使用外鍵過濾對象

我需要的是允許用戶通過過濾其相關對象訪問Parent對象列表Kid

比方說,一個過濾器,列出了孩子名叫比Z現場年長XY城市家長的對象,也沒有兒童X誰是年輕的Z住在Y城市。

models.py

class Parent(models.Model): 
    title = models.CharField(max_length=250) 


class Kid(models.Model): 
    cities = (
     ('city1', city1), 
     ('city2', city2) 
    ) 
    family = models.ForeignKey(Parent) 
    title = models.CharField(max_length=250) 
    age = models.CharField(max_length=250) 
    city = models.CharField(choices=cities) 

知道怎樣做,或在那裏/要尋找什麼答案?

回答

0

Related manager似乎是一個可行的選擇。

Django還提供了強大的,直觀的方式,以「跟隨」,在查找關係 ,自動照顧SQL JOINs的你,背後 場景。要跨越關係,只需使用跨模型的相關 字段的字段名稱(用雙下劃線分隔),直到獲得所需字段的 。

它也向後工作。要引用「反向」關係,只需使用模型的小寫名稱即可。

parents = Parent.objects.filter(kid__name=X,kid__age__gte=Y,kid__city=Z) 

PS:我還沒有測試此代碼。目的是提出一種方法建議。

編輯1:解決註釋中指出的排除異常。 Link to Django documentation. Refer to the note in this section

排除行爲與過濾器不同。排除在相關經理不使用條件的組合,而是排除例如。Parent.objects.exclude(kid__name=X,kid__city=Z)會排除城市Z,而不是用孩子的名字X孩子,孩子與名X誰是從城市Z

Django的建議的方法是:

Parent.objects.exclude(kid__in=Kid.objects.filter(name=X,city=Z)) 
+0

這不容易。因爲它會是'kid_set',而不是'kid'。這是一對多的關係。 –

+0

對不起@SardorbekImomaliev,我不跟着你。 OP的示例模型與Django文檔中的示例模型完全相同。我錯過了什麼? – Aditya

+0

孩子有家長,但家長有很多孩子。在示例實體有一個博客,但博客可以有很多實體,並在父母的關係字段將被稱爲'kid_set' –

1

你可以在反向邏輯中做到這一點。首先,你需要改變ageIntegerField否則你將無法進行比較的價值觀

class Kid(models.Model): 
    family = models.ForeignKey(Parent) 
    title = models.CharField(max_length=250) 
    age = models.IntegerField() 
    city = models.CharField(choices=cities) 

然後你就可以篩選與過濾遵守所有的孩子,並得到父母的IDS要篩選後

filter_ids = Kid.objects.filter(name=X, age__gte=Z, city=Y).values_list('parents_id', flat=True).distinct() 
exclude_ids = Kid.objects.filter(name=X, age__lt=Z, city=Y).values_list('parents_id', flat=True).distinct() 

parents = Parent.objects.filter(id__in=filter_ids).exclude(id__in=exclude_ids) 

回答評論 同樣的邏輯你首先填寫所有的父母與這樣的孩子,然後你排除有其他孩子的父母。

filter_ids = Kid.objects.filter(my_pattern).values_list('parents_id', flat=True).distinct() 
exclude_ids = Kid.objects.exclude(my_pattern).values_list('parents_id', flat=True).distinct() 

parents = Parent.objects.filter(id__in=filter_ids).exclude(id__in=exclude_ids) 
+0

如果我有對象,而不是一個列表?例如父母的名單反對他們的孩子只包括:20個名稱,每個名字都有一定的年齡和城市名稱? – DjangoGuy

+0

@DjangoGuy閱讀更新回答 –

+0

似乎很棒我現在正在嘗試! – DjangoGuy