Django ORM 多个表的一对多关系问题

问题描述 投票:0回答:1

型号:

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()

但我不知道如何与图像表创建关系。

django orm django-queryset django-select-related
1个回答
0
投票

但我不知道如何与图像表创建关系。

。您提出的查询是有问题的:它重复相同的数据,这会导致从数据库到 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')
)
© www.soinside.com 2019 - 2024. All rights reserved.