选择related - 来自外键的一个对象

时间:2014-12-10 12:21:22

标签: python django

models.py:

class Car(models.Model):
    pass

class Pictures(models.Model):
    car = models.ForeignKey(Car, related_name='pictures')
    image = models.ImageField(upload_to = get_file_path, max_length=64,)

所以,一辆车可以有很多照片。一页我需要写一些关于每辆车的信息,只有一张车的图片。

views.py:

cars = Car.objects.all().select_related('pictures__image').filter(active=1,).order_by('price').reverse()

但它不起作用。我在Car

中使用此方法
@property
    def default_picture(self):
        try:
            return self.pictures.all()[:1][0]
        except IndexError:
            return None

但它再向db发出一个请求。这是一个糟糕的解决方

如何通过对db的min请求做我想要的事情?

谢谢!

1 个答案:

答案 0 :(得分:1)

您无法通过单个查询执行此操作。但是使用django' prefetch_related(),您可以将查询数量减少到两个:

cars = Car.objects.all().prefetch_related('pictures')

@property
def default_picture(self):
    pics = self.pictures.all()
    return pics[0] if pics else None

文档在这里:https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.prefetch_related