【问题标题】:Django: how to load a Queryset with a specific field of a foreign key?Django:如何使用外键的特定字段加载查询集?
【发布时间】:2021-09-15 22:47:21
【问题描述】:

我有 2 个模型,PaintingPainter

 class Painting(models.Model):
    name = models.CharField(max_length=200)
    description = models.TextField()
    painter = models.ForeignKey(Painter)


 class Painter(models.Model):
    name = models.CharField(max_length=200)
    code = models.CharField(max_length=200)

实际上,Painting 有 30 列,Painter 有 3。

如何获得QuerySet 的绘画,而不是每个对象都有painter_id 它有painter_name

我尝试了很多变体:

paintings = Painting.objects.prefetch_related('painter_set__name').all()

但似乎无法正确处理。

我的最终目标是使用pandas 导出CSV,因此我希望QuerySet 中的每个对象都包含我感兴趣的所有字段。

我想做类似的事情

paintings = Painting.objects....
df = pandas.DataFrame(list(paintings.values()))
df.to_csv('blah.csv’)

【问题讨论】:

  • 你想对结果做什么?像Painting.objects.select_related('painter').values_list('description', 'painter__name') 这样的事情可能会做你想做的事。
  • 所以这里的模型只是我所拥有的模型的较小版本。 Painting 模型有 20 列,Painter 只有 3 列。最终我将通过 pandas.DataFrame(result) 将其转换为 CSV。我只想让绘画拥有我需要的所有 21 个领域。

标签: django django-models django-queryset


【解决方案1】:

支持这一点的一种方法是使用F expressions 为每一行加上相关的画家名称F expressions,如下所示:

from django.db.models import F

paintings = Painting.objects.annotate(painter_name=F('painter__name')).all()

绘画列表中的每个绘画实例都会有一个基于相关画家姓名字段的painter_name 属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-02
    • 2013-09-27
    • 2019-02-17
    • 2012-10-05
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    相关资源
    最近更新 更多