通过Django中的模型手动定义ManyToMany进行过滤

时间:2013-09-18 14:54:42

标签: django django-models

我的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

我希望现在更清楚了。

1 个答案:

答案 0 :(得分: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
    …

编辑:在深入研究之后,似乎每当你拨打.order_by时,django都会再做一次查询。因此,在这种情况下,您可能需要手动订购houseimages。例如:

houseimages = sorted(house.houseimage_set.all(), key=lambda x: x.order)