2017-08-07 117 views
0

我是初學者,在python和Django上工作我的第一個項目。我一步一步地克服了所遇到的幾乎所有困難,但是一個問題導致我陷入困境,我沒有更多的想法如何解決它。
目標是顯示當前在特定操場的每個用戶的孩子(孩子)。它應該是這樣的:我有一個特定用戶的「當前訪問」,我想顯示他/她的孩子/孩子。我不想選擇哪個孩子是在他/她的父母一個操場,在這個階段,我認爲整組可能的孩子去與他/她的父母:)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') 

假設家長和孩子們你相關名稱。