【问题标题】:Django unable to iterate prefetch_related objects at templateDjango 无法在模板中迭代 prefetch_related 对象
【发布时间】:2020-12-14 20:15:04
【问题描述】:

我无法在我的模板中访问我的 prefetch_related 对象,可以寻求帮助

views.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' 对象不可迭代

models.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)

提前致谢

【问题讨论】:

    标签: python django model prefetch


    【解决方案1】:

    support_ticket.reply_relation 是一个manager,不是QuerySet,所以你不能迭代它,你使用.all() [Django-doc] 来迭代它:

    {% for support_ticket in support_tickets %}
    …
        {% for reply_relation in support_ticket.reply_relation.all %}
            …
        {% endfor %}
    {% endfor %}

    【讨论】:

      猜你喜欢
      • 2019-09-02
      • 2012-08-10
      • 2013-12-16
      • 2020-10-17
      • 2017-12-23
      • 2021-10-30
      • 2014-10-18
      • 2016-04-22
      • 2017-07-25
      相关资源
      最近更新 更多