首页 > 解决方案 > 如何在 Django 中使用 prefetch_related 从查询集中获取属性?

问题描述

我有以下模型并使用 prefetch_related 提取查询集,如下所示。

queryset = Light.objects.filter(
    certificate__name="A").prefetch_related('zone__namingzone'
)  

从这个查询集中,我想得到以下数据集。

{"naming1":lpd1,"naming2":lpd2...}  

但是,当我尝试从如下查询集中提取属性时,我得到create_reverse_many_to_one_manager

for i in queryset:
    print (i.zone.namingzone)

我想要得到的是命名表中的命名属性。谁能告诉我如何提取这个?

模型.py

class Certificate(models.Model):
    name=models.CharField(max_length=20)

class Zone(models.Model):
    zone=models.CharField(max_length=20)

class Light(models.Model):
    certificate=models.ForeignKey(Certificate, on_delete=models.CASCADE,related_name='certificate')
    zone=models.ForeignKey(Zone, on_delete=models.CASCADE,related_name='lightzone')
    lpd=models.IntegerField()

    class Meta:
        unique_together = (('certificate', 'zone'),)

class Naming(models.Model):
    zone=models.ForeignKey(Zone, on_delete=models.CASCADE,related_name='namingzone')
    naming=models.CharField(max_length=20)

标签: django

解决方案


当您反向遍历 FK 时,您最终会得到一个经理,以及另一侧的多个项目。所以i.zone.namingzone在你的 for 循环中是一个经理,而不是一个NamingZone. 如果您将打印循环更改为:

for i in queryset:
    print (i.zone.namingzone.all())

您应该看到您的项目的所有命名区域。NamingZone您可以从以下各项中提取命名字段queryset

 queryset.values('zone__namingzone__naming')

您可能想从Light模型中提取一些其他字段,lpd例如:

 queryset.values('lpd', 'zone__namingzone__naming')

您可能有多次相同的ldp次数,就像它有命名区域一样多次。


推荐阅读