2016-11-19 4 views
0

は、ユーザーが自分の関連オブジェクト `キッドをフィルタリングすることによりParentオブジェクトのリストにアクセスできるようにすることです」FilterオブジェクトそのすべてのForeignKeyが辞書にある場合、私は必要なもの

我々は100の子供を持っている辞書を持っています。平均して約5人の子供を持つ両親。
親オブジェクトの1つの子供がすべて辞書に入っていて、それらをリストにしたい場合。 しかし、すべての子供が親オブジェクトに関連している必要はありません。

例えば、親がいない辞書と1にある4人の子供を持っている場合。次にそれらを含めないでください。

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


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

Views.py

def index(request): 
    patterns = [ 
     {'name': 'samy', 'age__lt': 15, 'city': 'paris'}, 
     {'name': 'sally', 'age__gt': 20, 'city': 'london'} 
    ] 
    filter_q = reduce(operator.or_, map(lambda p: Q(**p), patterns)) 
    filter_ids = Kid.objects.filter(filter_q).values_list('family__id', flat=True).distinct() 
    exclude_ids = Kid.objects.exclude(filter_q).values_list('family__id', flat=True).distinct() 
    parents = Parent.objects.filter(id__in=filter_ids).exclude(id__in=exclude_ids) 
    template = 'index.html' 
    context = {'parents': parents} 
    return render(request, template, context) 

はので、私の現在のビュー機能を上記に示した

は私が

models.py以下のコードを持っています。すべての子供は1親になければならない!

助けてください!ここで

+0

100人の子供たちと辞書はありますか?この例では – 2ps

+0

は存在しません。私は、オブジェクトが、私はあなたの質問は、あなたがすでに「100を持っている辞書を持っていることを述べたようにそれが聞こえたので、私は本当にあなたの質問を理解していないと思い – DjangoGuy

+0

によってフィルタリングされたいアイテムのリスト/辞書を作りたい意図しました子供。 "申し訳ありません。がんばろう! – 2ps

答えて

0

は私が正しくあなたの質問を理解している場合、私はどうなるのかです。

def index(request): 
    patterns = [ 
     {'name': 'samy', 'age__lt': 15, 'city': 'paris'}, 
     {'name': 'sally', 'age__gt': 20, 'city': 'london'} 
    ] 
    filter_q = reduce(operator.or_, map(lambda p: Q(**p), patterns))  
    qs = Kid.objects.filter(filter_q).values_list('id', 'family_id') 
    family_ids = set() 
    child_ids = list() 
    for child_id, family_id in qs: 
     family_ids.add(family_id) 
     child_ids.append(child_id)   
    # At this point we have the complete list of matching Kid(s) in child_ids 
    # . . . and we have a list of all family IDs in which those Kid(s) exist 
    # Now we look for incomplete families, 
    # i.e., families that were part of the first query, 
    # but have Kid(s) that are not in our complete list 
    # of matching kids. 
    incomplete_family_ids = set(Kid.objects.exclude(id__in=child_ids).filter(family_id__in=family_ids).values_list('family_id', flat=True).distinct()) 
    # Now we find the set complement to make life on the database a little easier. 
    complete_family_ids = family_ids - incomplete_family_ids 
    parents = Parent.objects.filter(id__in=complete_family_ids) 
    template = 'index.html' 
    context = {'parents': parents} 
    return render(request, template, context)  
+0

のために完璧に働きました。フィールド 'name'が名前のモデルであるforeginkeyの場合、それは実行できますか? – DjangoGuy

+0

はい、右のフィルタで一致するようにするには 'Name'モデルの定義を見る必要があります。しかし、本質的に、あなたはname__field_to_match'' '''にpatterns' name''in' '変化するであろう(例えば、' 'name__first_name'') – 2ps

+0

クラス名(models.Model): タイトル= models.CharField(MAX_LENGTH = 250) – DjangoGuy

関連する問題