python - 选择相关 - 从外键中选择一个对象

标签 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

但它又向数据库发出了一个请求。这是一个糟糕的解决方案。

如何用对数据库的最小请求来完成我想要的事情?

谢谢!

最佳答案

您无法通过单个查询来完成此操作。但是使用 django 的 prefetch_lated() 您可以将查询数量减少到两次:

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

关于python - 选择相关 - 从外键中选择一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27400882/

相关文章:

python - 如何根据匹配年份加上前 2 年从另一个数据框中提取多行

python - 如何配置 tox 以获取日志

Python 范围 len 与枚举

python - 理解 apyori 的输出

python - 查找元素* 返回具有相同元素的数组

python - Natural Key 导致 Django 测试失败

python - Django-rest-framework 在没有相关字段的情况下序列化多个查询

django - 尝试在 Django 中创建一个带有外键列表的 PostgreSQL 字段

python - Django 发送邮件

python - 使用 pytz 进行日期时间和时区转换 - 令人兴奋的行为