Django 'model'对象不可迭代

ma8fv8wu  于 2023-02-05  发布在  Go
关注(0)|答案(3)|浏览(171)

我有一个表,显示我的雇员注册。我想根据他们的数据库,其中包括他们的姓名,身份证,任命等生成一个简单的HTML页面。
为此,我向视图传递了一个id,这样它就可以获得相应用户的详细信息并显示给我。一切都正常工作,直到错误发生对象不可迭代。下面是我的代码。
report.html

{% if emp_item %}
 {% for some in emp_item %}
    <title> {{ some.employee_name }} Report</title>

    <h3>{{ some.employee_name }}</h3>

    <table style="width:30%" border="4">

        <td>{{some.id}}</td>
        <td>{{some.Annual_leave}} </td>
        <td>{{some.Sick_leave}} </td>
        <td>{{some.allowed}} </td>

        </table>

{% endfor %}

<h2>No User</h2>
{% else %}
{% endif %}

views.py

@staff_member_required  # for admin login required
def report(request, id):
    emp_item = Employee.objects.get(id=id)
    context = {'emp_item': emp_item}
    return render(request, 'projectfiles/report.html', context)

urls.py

url(r'^(?i)Rejectleaves/$', views.rejected_leave_show,
        name='Reject_show'),  # user leaves

    url(r'^(?i)report/(?P<id>\d+)$', views.report,
        name='Report'),  # user Report

models.py

class Employee(models.Model):

    allowed = models.BooleanField(default=True)
    employee_name = models.OneToOneField(User, on_delete = models.CASCADE)
    employee_designation = models.CharField(max_length = 5)
    employee_department = models.CharField(max_length = 5)
    Annual_leave = models.PositiveSmallIntegerField(default=5)
    Sick_leave = models.PositiveSmallIntegerField(default=5)

我想根据每个用户的流程查看他们的数据。

fkaflof6

fkaflof61#

Employee.objects.get(id=id)更改为Employee.objects.filter(id=id)
filter()将始终为您提供QuerySet”-它是可迭代的
get()-返回单个对象,并且该对象不可迭代

0tdrvxhp

0tdrvxhp2#

您正在将emp_item作为一个对象列表进行迭代,但它是一个对象,因为Employee.objects.get(id=id)返回的是单个对象而不是查询集。
因此,您需要做的是从模板中删除for-loop,如下所示:

{% if emp_item %}
    <title> {{ emp_item.employee_name }} Report</title>

    <h3>{{ emp_item.employee_name }}</h3>
    ...and so on
{% else %}
<h2>No User</h2>
{% endif %}

但是如果你在查询的时候使用get,那么你得到DoesNotExist异常的机会就更大了,所以最好还是使用Employee.objects.filter(id=id)来避免任何异常。
如果使用get进行查询,则模板中的{% if emp_item %}没有任何用处。
为了更好的使用,可以在查询的时候使用get,如果出现异常可以给模板发消息,例如:

def report(request, id):
    try:
        emp_item = Employee.objects.get(id=id)
        return render(request, 'projectfiles/report.html', {'emp_item':emp_item})
    except Employee.DoesNotExist:
        return render(request, 'projectfiles/report.html', {'error': 'No data found.'})

然后在模板中:

{% if error %}
    {{ error }}
{% else %}
    <title> {{ emp_item.employee_name }} Report</title>
    .... and so on to display other data
{% endif %}
kqhtkvqz

kqhtkvqz3#

我得到了下面相同的错误:
TypeError:“Category”对象不可迭代
因为我将get()生成的对象赋值给category__in,如下所示:

# Here                     # Here
Product.objects.filter(category__in=Category.objects.get(pk=1))

因此,我将filter()生成的查询集分配给category__in,如下所示,然后错误就解决了:

# Here
Product.objects.filter(category__in=Category.objects.filter(pk=1))

或者,我从category__in中删除了__in,如下所示,然后错误就解决了:

# ↓ "__in" is removed
Product.objects.filter(category=Category.objects.get(pk=1))

相关问题