繁体   English   中英

使用外键的 Django 查询

[英]Django Query using Foreign Key

我开始使用 django 中的查询,并尝试在 sql 中复制连接的结果。

我有两个模型代表父母(WaiverAdult)和孩子(WaiverMinor)。 我想返回查询集中的父项和子项,因此我可以将它们分组到一个格式化的模板中,如下所示:

  John Dad
    Tommy Son
    Amber Daughter

  Jen Jones
    Stevie Jones
    Mike Jones

楷模:

class WaiverAdult(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50, blank=True)

class WaiverMinor(models.Model):
    first_name = models.CharField(max_length=50, blank=True)
    last_name = models.CharField(max_length=50, blank=True)
    parent = models.ForeignKey(WaiverAdult, on_delete=models.CASCADE)

看法:

class WaiverListView(ListView):

    waiver_adults = WaiverAdult.objects.all().prefetch_related(
        'waiverminor_set').order_by('created')

    queryset = [adult.waiverminor_set.all() for adult in waiver_adults]

    context_object_name = "waiver_list"
    template_name = 'waiver/waiver_list.html'

模板示例概述我正在尝试的内容:


                    {% for adult in waiver_list %}

                    <tr>
                        <td>{{adult.last_name}}, {{adult.first_name}}</td>
                    </tr>

                        {% for child in waiver_list %}
                            <tr>
                                <td>{{child.last_name}}, {{child.first_name}}</td>
                            </tr>
                        {% endfor %}


                    {% endfor %}

编写此查询的正确方法是什么? 先感谢您。 我真的很感激指导。

如果您希望访问相关对象,最好的方法是预取它们,这样您就不会在每次要访问相关对象时再次访问数据库。 你可以这样做:

waiver_adults = WaiverAdult.objects.all().prefetch_related('waiverminor_set').order_by('created')

这将是您的视图的查询集,因此您可以在视图中编写:

queryset = waiver_adults

然后在模板中,您可以通过以下方式以您想要的方式循环:

{% for adult in waiver_list %}

<tr>
    <td>{{adult.last_name}}, {{adult.first_name}}</td>
</tr>

  {% for child in adult.waiverminor_set.all %}
       <tr>
         <td>{{child.last_name}}, {{child.first_name}}</td>
       </tr>
  {% endfor %}

{% endfor %}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM