Python 如何修复django中的双for循环
html显示LostNotices和Dogs 我想在dog模型中使用外键匹配lostnotice和dog 所以我在模板中使用了for循环和if 但它不起作用 我试图修复这两天,但我不能 这对我会有很大的帮助。多谢各位Python 如何修复django中的双for循环,python,django,templates,Python,Django,Templates,html显示LostNotices和Dogs 我想在dog模型中使用外键匹配lostnotice和dog 所以我在模板中使用了for循环和if 但它不起作用 我试图修复这两天,但我不能 这对我会有很大的帮助。多谢各位 {% for lostPost in lostPosts.all reversed %} <h6>{{lostPost.id}}</h6> {% for dog in dogs.all %}
{% for lostPost in lostPosts.all reversed %}
<h6>{{lostPost.id}}</h6>
{% for dog in dogs.all %}
<h6>{{dog.breed}}</h6><br>
<div class="col-lg-3 col-sm-6 col-md-6">
<div class="card">
<div class="card-body">
{% if dog.LostNoticeNum == lostPost.id %}
model.py
class LostNotice(models.Model):
Title=models.CharField(max_length=20,null=True)
State=models.IntegerField()
PubDate=models.DateTimeField()
MissingDate=models.DateTimeField()
Text=models.TextField()
Phone=models.CharField(max_length=20,null=True)
Author=models.ForeignKey(Member, on_delete = models.CASCADE,null=True)
Si=models.CharField(max_length=20,null=True)
Gu=models.CharField(max_length=20,null=True)
Dong=models.CharField(max_length=20,null=True)
class Dog(models.Model):
Name=models.CharField(max_length=20)
Breed=models.CharField(max_length=20)
Sex=models.CharField(max_length=20,null=True)
Color=models.CharField(max_length=20,null=True)
LostNoticeNum=models.ForeignKey(LostNotice, on_delete = models.CASCADE,null=True)
FindNoticeNum=models.ForeignKey(FindNotice, on_delete = models.CASCADE,null=True)
模板:
<div class="" id="list">
<div class="container">
<div class="row mx-auto">
<div class="col-lg-12 col-sm-12 col-md-12 col-12 pr-1">
<div class="row mb-2 ml-2 mr-2">
{% for lostPost in lostPosts.all reversed %}
<h6>{{lostPost.id}}</h6>
{% for dog in dogs.all %}
<h6>{{dog.breed}}</h6><br>
<div class="col-lg-3 col-sm-6 col-md-6">
<div class="card">
<div class="card-body">
{% if dog.LostNoticeNum == lostPost.id %}
<h6>breed</h6>
<h6 class="card-title" style="text-align: center; color: gray">{{dog.Breed}}</h6>
{% else %}
<h6 class="card-title" style="text-align: center">{{lostPost.sex}}</h6>
{% endif %}
{{lostPost.photo}}
{% if lostPost.photo %}
<img class="card-img-top rounded-circle mx-auto pt-1" src="{{ lostPost.photo.url }}"
style="height: 200px">
{% else %}
<img class="card-img-top rounded-circle mx-auto pt-1"
src="https://image.flaticon.com/icons/svg/2138/2138440.svg" style="height: 200px">
<h4 class="card-title">{{lostPost.pet_name}}</h4>
<p class="card-text"> text: {{lostPost.Text}} <br> location: {{lostPost.Si}}<br>date :
{{lostPost.MissingDate}}</p>
<a href="{% url 'lostListDetail' %}" class="btn btn-primary">more</a>
{% endif %}
</div>
</div>
</div>
{% endfor %}
{% endfor %}
</div>
</div>
</div>
</div>
</div>
{lostPosts.all中lostPost的%s已反转%}
{{lostPost.id}
{%用于狗中的狗。所有%}
{{狗.品种}}
{%if dog.LostNoticeNum==lostPost.id%}
繁殖
{{狗.品种}
{%else%}
{{lostPost.sex}
{%endif%}
{{lostPost.photo}
{%if lostPost.photo%}
{%else%}
{{lostPost.pet_name}
文本:{{lostPost.text}
位置:{{{lostPost.Si}}
日期:
{{lostPost.MissingDate}
{%endif%}
{%endfor%}
{%endfor%}
您可以使用.dog\u set访问相关的狗。所有
:
{% for lostPost in lostPosts reversed %}
<h6>{{lostPost.id}}</h6>
{% for dog in lostPost.dog_set.all %}
<h6>{{dog.breed}}</h6><br>
…
{% endfor %}
{% endfor %}
谢谢你的评论!但我不知道“dog_set”和“prefetch_related(‘dog’)”是从哪里来的。LostNotice模型中没有“dog”属性。。。像这样使用double-for-loop可以吗?@YeinKoo:不,这样的double-for-loop不仅“难看”(从你需要阅读才能理解的意义上讲),而且效率也很低。想象一下,以后你有1百万只狗,1百万只丢失的门柱,那么这将需要1T个周期(而访问
dog\u集
仍将导致1百万个周期)。dog\u集(和dog
)是隐式定义的:通过定义ForeignKey
从dog
到LostNotice
,Django反向定义了一个关系。@YeinKoon:所以您根本不需要定义dog
。Django为您定义了反向关系,它能够通过反向关系本身加载和获取对象。通过使用预回迁,我不必使用双for循环!是这样吗?@YeinKoo:这个想法是Django将获取所有相关的狗,并在Python/Django层进行连接,从而避免N+1问题。在模板中,我们仍然有一个嵌套的{%for%}
循环,但是lostPost.dog\u集合。所有只包含相关的狗。
{% for lostPost in lostPosts reversed %}
<h6>{{lostPost.id}}</h6>
{% for dog in lostPost.dog_set.all %}
<h6>{{dog.breed}}</h6><br>
…
{% endfor %}
{% endfor %}
def lostList(request):
lostPosts = LostNotice.objects.prefetch_related('dog')
dogs=Dog.objects
return render(request, '/lostList.html', {'lostPosts' : lostPosts})