0

私は2つのモデルを持っています:

class Game(models.Model):
    title = models.CharField(max_length='255', blank=False, db_index=True)

class GameImage(models.Model):

    TYPES = (
        ('small_image', 'Small Image'),
        ('medium_image', 'Medium Image'),
        ('feature_image', 'Feature Image'),
        ('subfeature_image', 'Sub-feature Image'),
        ('sc1', 'Screenshot 1'),
        ('sc2', 'Screenshot 2'),
        ('sc3', 'Screenshot 3'),
    )

    game = models.ForeignKey("Game", related_name="images", editable=False)
    image = ImageField(upload_to=gameimage_storage_path, max_length=255)
    type = models.CharField(max_length=16, choices=TYPES, db_index=True)

私が行った場合

games = Games.objects.prefetch_related('images').all()

私が行うと、すべての「画像」関連オブジェクトが添付されます。

games = Games.objects.prefetch_related('images').filter(images__type__contains='small_image').all()

「small_image」タイプの画像を持つゲームを表示しますが、ゲームに関連するすべての GameImage オブジェクトをロードします。

どのゲームにも type='small_image' の GameImages 関連オブジェクトのみが含まれるゲームのリストをロードするにはどうすればよいですか (ゲームに関連する他の GameImage オブジェクトはロードされません)。生のSQLでこれを行うことができますが、Django ORMでこれを行うにはどうすればよいですか? 助けてください。

アップデート。 ORM 経由で実現したい SQL クエリは次のとおりです。

SELECT * FROM game g LEFT JOIN gameimage i ON g.id = i.game_id AND i.type = 'small_image';
4

2 に答える 2

1

加入

GameImage.objects.filter(img_type='small_image').select_related('game')

左の参加ゲーム

from django.db.models import Q

GameImage.objects.filter(
    Q(img_type='small_image') | 
    Q(game__isnull=True)
).select_related('game')

左ジョインゲームイメージ

Game.objects.filter(
    Q(images__img_type='small_image') |
    Q(id__isnull=True)
).select_related('images')
于 2012-12-23T17:08:37.543 に答える
0

したがって、すべてのゲームが必要ですが、ゲームに small_image があるかどうかを、余分な関連画像を読み込まずに確認したい場合:

models.py:

from django.core.exceptions import ObjectDoesNotExist

Class Game(models.Model):
    title = models.CharField(max_length='255', blank=False, db_index=True)

    def get_small_image(self):
        try:
            return self.images.get(type='small_image')
        except ObjectDoesNotExist:
            return None

ビュー.py:

games = Game.objects.all()
for game in games:
    small_image = game.get_small_image()
    if small_image:
        print small_image.image.url
    else:
        print 'there is no small image for this game'
于 2012-12-22T23:20:05.630 に答える