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 オブジェクトの数だけデータベースにヒットしないようにする方法はありますか?

編集:

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 に答える