2017-08-07 21 views
0

私は最初のプロジェクトに取り組んでいるPythonとDjangoの初心者です。ステップバイステップ私は、私が遭遇したほとんどすべての困難を克服することができましたが、1つの問題は、私が立ち往生し、それを解決する方法がなくなったことが原因です。
目的は、現在特定のプレイグラウンドにいる各ユーザーの子(子)を表示することです。それは次のようになるはずです:特定のユーザーの「現在の訪問」があり、その子供を表示したい。Python/Django複雑な/ネストされたクエリ

:私は私のモデルであり、子供の全体の可能なセットは、彼/彼女の親:)ここ

に行くことを前提とし、この段階では、彼/彼女の親との遊び場である子を選択する必要はありません

class Quarter(models.Model): 
    name = models.CharField(max_length=64, choices=QUARTER, default='not defined') 

class Pground(models.Model): 
    place = models.CharField(max_length=128) 
    description = models.TextField() 
    quarter = models.ForeignKey(Quarter) 

class Child(models.Model): 
    name = models.CharField(max_length=128) 
    age = models.IntegerField(choices=AGE, default=-1) 
    sex = models.IntegerField(choices=SEX, default=1) 
    whose_child = models.ForeignKey(User) 


class Parent(models.Model): 
    user = models.OneToOneField(User) 
    quarter = models.ForeignKey(Quarter) 
    children = models.ManyToManyField(Child) 


class Visit(models.Model): 
    who = models.ForeignKey(User) 
    pground = models.ForeignKey(Pground) 
    time_from = models.DateTimeField() 
    time_to = models.DateTimeField() 

し、関連するビューこのように今まで行く:

 class HomeLogView(LoginRequiredMixin, View): 
    login_url = '/login/' 
    def get(self, request): 
     user = request.user 
     quarter = user.parent.quarter 
     pgrounds = quarter.pground_set.all() 
     current_visits = {} 
     for pground in pgrounds: 
      now = datetime.now() 
      current_visits[pground] = pground.visit_set.filter(time_from__lte=now, time_to__gte=now) 
      current_visits[pground] = {} 
      this_visits = pground.visit_set.filter(time_from__lte=now, time_to__gte=now) 
      for visit in this_visits: 
       current_visits[pground][visit] = Child.objects.filter(whose_child=visit.who) 
       this_children = Child.objects.filter(whose_child=visit.who) 

     ctx = {'user': user, 'quarter': quarter, 'pgrounds': pgrounds, 'current_visits': current_visits, 'this_visits': this_visits, 'this_children': this_children} 
     return TemplateResponse(request, 'home_login.html', ctx) 

だから、テンプレート(一部)で:

<dt>{% for pground, current_visits in current_visits.items %} 
      <dd><h3>{{pground.place}}</h3></dd> 
       {% for visit in current_visits %} 
      <dd>Użytkownik: <mark>{{visit.who}}</mark> na placyku od: {{visit.time_from}} 
       do: {{visit.time_to}} {{visit.pground}} <a href="/new_message/{{visit.who.id}}">Send message</a></dd> 
       {% for visit, this_visits in current_visits.items %} 
        {% for child in this_visits %} 
         {{child.name}} {{child.age}} 
        {% endfor %} 
       {% endfor %}     
       {% endfor %} 
      {% endfor %} 
     </dt> 

私は、各訪問に付随する特定の遊び場に子供たちのセット全体を持っています。しかし、私の目標は、このパターンで情報を表示することです:それぞれの "現在の訪問"について、親、彼/彼女の子供/子供の基礎に。

私が立ち往生した場所から移動する方法についてアドバイスをいただき本当に感謝しています。ご協力いただきありがとうございます!

+0

現在のモデルデザインでは、特定の親のすべての子供が遊び場にいると仮定しています。そうでなければ、あなたの現在のモデル構造はこれを扱うことができません。 –

+0

子供を、親ではなく子供の訪問を捕らえるためのユーザにもする。 –

+0

ありがとうございました。あなたは正しいですが、最終的には、どちらの子どもがその親を持つ遊び場にいるのかを選択するオプションがあります。しかし、この段階では私はこれをやろうとはしません。特定のユーザーの子供の完全なセットを表示したいだけです。このユーザーには、「現在の訪問」があります。 – berek

答えて

0

親で設定related_nameと

class Child(models.Model): 
    name = models.CharField(max_length=128) 
    age = models.IntegerField(choices=AGE, default=-1) 
    sex = models.IntegerField(choices=SEX, default=1) 
    whose_child = models.ForeignKey(User, related_name='children') 

のような子供モデルあなたはあなたのような照会、変更することができます照会している間:親と子供を想定し

this_visits = pground.visit_set.filter(time_from__lte=now, time_to__gte=now).prefetch_related('parent__children') 

あなたは、関連する名前です。