django - 如何在 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)
解决方案
当您反向遍历 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
次数,就像它有命名区域一样多次。
推荐阅读
- javascript - 如何使用 HTML 获取用户输入以在 JS 中处理?
- python - 如何修复此代码中的错误?
- java - 如何在给定时间(例如上午 7:15)安排任务
- excel - COUNTIF 取决于单元格格式和输入类型?
- swift - MapKit - 找到路线但未显示
- kubernetes-helm - Helm:如何使用“.Files.Get”将 json 导入配置映射
- python - 如何在 request.post 方法中使用 json 和 files 参数上传文件
- swift - 在数据显示之前等待 1-2 秒从 Firebase 获取数据(IOS)
- typescript - 我们如何使用 Typescript 和 CodeceptJS 来测试框架?
- android - Android:在自定义视图中获取 TypedArray 中的 xml 文件