Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何检查没有嵌套循环的两个模型ID?_Python_Django_Django Models_Django Templates_Django Views - Fatal编程技术网

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的回答对我有好处。谢谢你。