0
# models.py
class Gallery(models.Model):
    images = models.ManyToManyField(Image, null=True, blank=True)

class Image(models.Model):
    image = models.ImageField()


# views.py
class GalleryIndex(ListView):
    model = Gallery

すべてのギャラリーのサムネイルを取得する必要があります。これは、最初/最後/どんな画像でもあります。Gallery.images2番目のSQLクエリを呼び出さずに、ギャラリーのカスタム属性として(オーバーライドしないように)画像を1で制限するにはどうすればよいですか?

4

3 に答える 3

0

多対多は通常のクエリセットの記述子として機能するためmy_gallery.images.all()[0]、クエリを 1 に制限することができます。

于 2013-02-02T23:13:34.630 に答える
0

私はあなたが何をしたいのか正しく理解していないと思いますが、以下のコードはうまくいきませんか?

class Gallery(models.Model):
    images = models.ManyToManyField(Image, null=True, blank=True)

    def get_thumb(self):
        return self.images.all()[0]

または多分他の概念:

class Gallery(models.Model):
    images = models.ManyToManyField(Image, null=True, blank=True)
    thumbnail = models.ImageField()

    def save(self, *args, **kwargs):
        self.thumbnail = self.images.all()[0].image

(ただし、ここでキャッチするいくつかの例外が必要です)

于 2013-02-02T23:14:13.773 に答える
0

私はドキュメントをもっとよく読むべきでした。標準の QuerySet API では、このようなケースを効率的に処理できない (遅い親フィールドごとに句をannotate()生成する) ため、メソッドと生のサブクエリを使用します。GROUP BYextra()

class GalleryIndex(ListView):
    queryset = Gallery.objects.extra(select={'thumb':
        """
        SELECT "image"
        FROM "app_image", "app_gallery_images"
        WHERE (
            "app_gallery"."id" = "app_gallery_images"."gallery_id"
            AND "app_gallery_images"."image_id" = "app_image"."id"
        )
        AND "app_image"."image" IS NOT NULL
        LIMIT 1
        """
    })

SorlImageField (および ImageField) は、テンプレートでサムネイルを表すためにファイル名のみを必要とするため、このクエリセットはまさに私が望んでいたことを行います。

于 2013-02-03T13:29:48.777 に答える