型号:

class Mark(models.Model):
  name = models.CharField(max_length=200, verbose_name="Марка", unique=True, null=True)

  #...


class Model(models.Model):
  mark = models.ForeignKey(Mark, on_delete=models.CASCADE, verbose_name="Марка")
  name = models.CharField(max_length=200, verbose_name="Модель", unique=True, null=True)

  #...


class Car(models.Model):
  vin = models.CharField(max_length=100, null=True)

  #...

class Image(models.Model):
  car = models.ForeignKey(Car, related_name='images', on_delete=models.CASCADE)
  image = models.ImageField(upload_to=get_upload_path, verbose_name="Фото")

  #...

如何在没有RAW的情况下在Django ORM中进行以下查询:

query = "SELECT c.*, m.name mark_name, JSON_ARRAYAGG(img.image) image FROM incarcatalog_car c \
LEFT JOIN incarcatalog_mark m ON m.id=c.mark_id \
LEFT JOIN incarcatalog_image img ON img.car_id=c.id \
WHERE c.id>%s \
GROUP BY c.id;"
queryset = Car.objects.raw(query, [id])

我的问题是. 我对Mark,Model表进行了左连接,但我不知道如何将CAR表与Image表连接起来

queryset = Car.objects.select_related("mark", "model").all()

但我不知道如何创建与Image表的关系.

推荐答案

但我不知道如何创建与Image表的关系.

don't.你提出的查询是有问题的:它重复相同的数据,这会导致从数据库到Django服务器的大量带宽,也会增加内存使用.

使用.prefetch_related(…) [Django-doc]来获取图像:

queryset = Car.objects.select_related('mark', 'model').prefetch_related('images')

这将在第二个请求中获取图像,因此您可以使用以下命令打印图像:

for item in queryset:
    for image in item.images.all():
        print(image.image.url)

如果数据库支持将数据聚合为列表,则可以使用:

from django.contrib.postgres.aggregates import ArrayAgg

queryset = Car.objects.select_related('mark', 'model').annotate(
    imgs=ArrayAgg('images__image')
)

Django相关问答推荐

在Django中使用Generil.ListView类时,分页不起作用

执行官/start.sh:没有这样的文件或目录

Django AWS S3对象存储boto3媒体上传报错

防止 django 将_id附加到外键字段

如何解决 AssertionError: .accepted_renderer not set on Response in django and ajax

Django Calendar日历小部件?

用于测试文件下载的 Django 单元测试

如何从 django 自定义中间件类返回 rest_framework.response 对象?

Django中的单表继承

Django:如何从模板调用视图函数?

is_valid() vs clean() Django 表单

如何按名称设置 django 模型字段?

在 Django 应用程序之间共享模型

如何覆盖 django 管理员翻译?

模拟 Django 查询集以测试采用查询集的函数

如何在 django 元素中开始做 TDD?

如何在 Django/Python 中减go 两个日期?

Django Rest 框架 ImageField

如何在 Django 中更改上传文件的文件名?

Django的不区分大小写的网址?