python - Django 无法在模板中迭代 prefetch_related 对象
问题描述
我无法在我的模板中访问我的 prefetch_related 对象,可以帮忙
视图.py
def support(request, pk=None):
...
else:
list_support_tickets = sorted(
chain(
SupportTickets.objects.filter(Q(status=0) | Q(status=1), requester=request.user).prefetch_related('reply_relation'), #Can't iter object
), key=attrgetter('creation_date'), reverse=True
)
paginator = Paginator(list_support_tickets, 10)
page = request.GET.get('page')
support_tickets = paginator.get_page(page)
args = {'support_tickets': support_tickets,
'form': form
}
print(list_support_tickets)
return render(request, template, args)
在我的模板中,我执行以下操作:
{% for support_ticket in support_tickets %}
...
{% for reply in support_ticket.reply_relation %}
<span class="font-size-small">We have a query, yeah</span>
{% endfor %}
{% endfor %}
但我无法在这里查询,错误:
TypeError:“GenericRelatedObjectManager”对象不可迭代
模型.py
class SupportTicketMessages(models.Model):
content_type = models.ForeignKey(ContentType, limit_choices_to=referential_models, on_delete=models.CASCADE)
object_id = models.CharField(max_length=36)
content_object = GenericForeignKey('content_type', 'object_id')
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='support_ticket_reply_author', verbose_name='Author', blank=True)
reply = models.TextField(verbose_name="Reply Content", max_length=2000)
date = models.DateTimeField(auto_now_add=True, blank=False)
class SupportTickets(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, unique=True)
ticket_id = models.IntegerField(default=ticket_id_generator, unique=True, blank=False, null=False, editable=False)
requester = models.ForeignKey(User, on_delete=models.CASCADE, null=False, blank=False)
category = models.IntegerField(choices=TICKET_CATEGORY, verbose_name='Ticket Category')
subject = models.CharField(max_length=40)
problem_description = models.TextField(max_length=5000)
status = models.IntegerField(choices=STATUS_OF_TICKET, verbose_name='Ticket Status', default=0)
reply_relation = GenericRelation(SupportTicketMessages, related_query_name='reply_relation')
creation_date = models.DateTimeField(auto_now_add=True, null=True)
提前致谢
解决方案
support_ticket.reply_relation
是manager,而不是 a QuerySet
,所以你不能迭代它,你使用.all()
[Django-doc]来迭代这个:
{% for support_ticket in support_tickets %}
…
{% for reply_relation in support_ticket.reply_relation.all %}
…
{% endfor %}
{% endfor %}
推荐阅读
- c# - ForEach 中的 db.SaveChanges 导致“不允许新事务,因为会话中正在运行其他线程”
- azure - 如何使用 arm-template-parameters-definition.json 文件自定义参数化 ADF 复制活动设置?
- python - 如何在没有按钮的情况下提交 recaptcha v2 表单?
- powerpoint - 使用 Office API 在演示模式下更新 PowerPoint 幻灯片元素
- amazon-web-services - 重复数据删除缓存
- css - 以相同大小和响应式显示图像,bootstrap 4 和 django
- ios - 如何在另一个视图中获取在 UIView 中点击了哪个特定按钮的信息
- node.js - 您如何导出自定义环境模块声明以供消费者使用?
- windows - Mosquitto 代理上的客户端连接数量增加
- excel - 遍历文件夹和子文件夹以查找 *csv 文件 excel VBA