Python 如何检查没有嵌套循环的两个模型ID?
我的问题是我的模板的嵌套循环。。。我使用它检查我的型号Python 如何检查没有嵌套循环的两个模型ID?,python,django,django-models,django-templates,django-views,Python,Django,Django Models,Django Templates,Django Views,我的问题是我的模板的嵌套循环。。。我使用它检查我的型号sitio.id_sitio是否与另一型号comprobante.id_sitio具有外键的等效id,然后如果找到一个结果,则打印a,如果没有,则打印B 条件if工作正常,但我不希望嵌套循环打印多次 如果找到一个结果,我想打破这个循环,只打印一次HTML,就像 否则,如果for结尾的记录中不存在结果,我想打印无付款 我不知道是否必须在views.py中编写查询,或者是否必须在模板中执行其他操作。。。 有没有正确的方法可以做到这一点 这是我的
sitio.id_sitio
是否与另一型号comprobante.id_sitio
具有外键的等效id,然后如果找到一个结果,则打印a,如果没有,则打印B
条件if工作正常,但我不希望嵌套循环打印多次
如果找到一个结果,我想打破这个循环,只打印一次HTML,就像
否则,如果for结尾的记录中不存在结果,我想打印无付款
我不知道是否必须在views.py中编写查询,或者是否必须在模板中执行其他操作。。。
有没有正确的方法可以做到这一点
这是我的代码: Models.py
class Comprobante(models.Model):
id_sitio = models.ForeignKey('Sitio', models.DO_NOTHING, db_column='id_sitio', blank=True, null=True)
class Sitio(models.Model):
id_sitio = models.IntegerField(primary_key=True)
sitio = models.CharField(max_length=100, blank=True, null=True)
def __str__(self):
return self.sitio
Views.py
def topsitios(request):
sitio = Sitio.objects.all()[0:100]
comprobante = Comprobante.objects.all()[0:100]
context = {'sitio': sitio, 'comprobante': comprobante}
return render(request, "sitio_ptc/topsitios.html", context)
Template.html
{% block content %}
{% for s in sitio %}
<tr>
<th scope="row"> {{ forloop.counter }}</th>
<td> {{ s.sitio }} </td>
<td>
{% for c in comprobante %}
{% if s.id_sitio == c.id_sitio_id %}
<a href="">Checkouts</a>
{% else %}
<p>no payments</p>
{% endif %}
{% endfor %}
</td>
</tr>
{% endfor %}
{% endblock %}
{%block content%}
{sitio%中s的%s}
{{forloop.counter}}
{{s.sitio}}
{comprobante%中c的%s}
{%if s.id_sitio==c.id_sitio_id%}
{%else%}
不付款
{%endif%}
{%endfor%}
{%endfor%}
{%endblock%}
快速解决方案是:
{% if c.id_sitio_id == s.id_sitio %}
由于compobante.id_sitio
是与具有自定义主键的模型相关的外键,因此c.id_sitio_id
(\u id
是Django添加的后缀,它保留主键的值,在大多数情况下通常是id
-字段)存储sitio.id_sitio
的值
但我会重构您的代码,使其更清晰、更灵活,如下所示:
# models.py
class Comprobante(models.Model):
sitio = models.ForeignKey('Sitio', on_delete=models.SET_NULL, blank=True, null=True)
class Sitio(models.Model):
name = models.CharField(max_length=100, blank=True, null=True)
# in the template
...
{% if s.id == c.sitio_id %}
...
您可以在
Comprobante
类中使用相关名称属性
class Comprobante(models.Model):
id_sitio=models.ForeignKey(
"西托",,
什么都不做,
相关_name='compobantes',
db_column='id_sitio',blank=True,null=True)
一旦设置了相关的_名称,就可以在模板中使用它进行检查
{%block content%}
{sitio%中s的%s}
{{forloop.counter}}
{{s.sitio}}
{%if s.comprobantes%}
{Hay un compobante para el-sitio}
{%else%}
不付款
{%endif%}
{%endfor%}
{%endblock%}
希望这有帮助正确的方法是使用Django ORM访问模型的关系。在每个
sitio
的for循环中,您可以通过{%if s.comprobante\u set.all%}
检查是否存在任何相关的comprobante
为了获得更好的性能,您还需要通过
Sitio.objects.prefetch\u related('compobante\u set').all()预取相关的compobante
记录。这样,您就不会遇到N+1查询问题。这是我的工作,非常感谢!如果有人正在搜索有关预回迁的更多信息,这里有一个链接:我在发布时键入错误,但我现在使用c.id\u sitio\u id进行编辑,循环问题现在解决了,但无论如何感谢您使我的代码更干净,我会修复它:)我尝试了这个方法,但它不起作用,它总是转到签出,即使数据库中的id为null。不管怎么说,Tianissimo的回答对我有好处。谢谢你。