【问题标题】:How I can get attribute from queryset using prefetch_related in Django?如何在 Django 中使用 prefetch_related 从查询集中获取属性?
【发布时间】:2018-11-26 15:18:52
【问题描述】:

我有以下模型并使用 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)

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

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


    【解决方案1】:

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

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

    您应该会看到您的项目的所有命名区域。您可以从queryset 中提取每个NamingZone 的命名字段,如下所示:

     queryset.values('zone__namingzone__naming')
    

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

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

    您可能多次拥有相同的ldp,其次数与命名区域的次数一样多。

    【讨论】:

      猜你喜欢
      • 2019-03-16
      • 1970-01-01
      • 2014-11-29
      • 2021-08-25
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多