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.images不调用第二个 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 BY子句很慢)所以我提供了extra()方法和原始子查询。

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 回答