0

我的 models.py 看起来像这样:

class House(models.Model):
    images = models.ManyToManyField('Image', through='HouseImage')

class HouseImage(models.Model):
    house = models.ForeignKey('House')
    image = models.ForeignKey('Image')
    order = models.IntegerField(default=99)

class Image(models.Model):
    url = models.CharField(max_length=200)

我无法编写代码来获取所有 House 对象,并为每个房子提供一个 order 属性值最低的图像。有没有办法做到这一点,并且不会像 House 对象那样多次访问数据库?

编辑:

HouseImage 表

house  image  order
 1       1      1  
 1       2      2
 1       3      3
 2       4      2
 2       5      1
 3       6      1

图像表

id    url
1     a
2     b
3     c
4     d
5     e
6     f

我的 django 查询集中需要以下结果:

house_id    image_url
1           a
2           e
3           f

我希望现在更清楚了。

4

1 回答 1

0

您可以预取相关的没有额外的查询。例如:

houses = House.objects.prefetch_related('houseimage_set__image')

然后,当您循环房屋或您正在做的任何事情时,您可以获得最低顺序的图像,如下所示:

for house in houses:
    houseimages = house.houseimage_set.order_by('order')
    if houseimages:
        image = houseimages[0].image
    else:
        image = None
    …

编辑:在深入研究之后,似乎 django 每次调用时都会进行另一个查询.order_by。因此,在这种情况下,您可能必须houseimages手动订购。例如:

houseimages = sorted(house.houseimage_set.all(), key=lambda x: x.order) 
于 2013-09-18T20:42:00.267 回答