2013-02-02 84 views
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 

我需要爲每個圖庫獲取縮略圖,這是它的第一張/最後一張/任何圖像。 如何在不調用第二個SQL查詢的情況下將任何圖庫的圖像限制爲自定義屬性(不覆蓋Gallery.images)?Django ORM m2m限制爲1

回答

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的)只需要文件名來表示模板的縮略圖。

0

一個多一對多作爲一個正常的查詢集的描述符,所以你可以做my_gallery.images.all()[0]限制查詢到1

+0

這隻適用於每個畫廊,但不適用於所有人......我錯了嗎? – mktums

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 

(有些異常醒目這裏雖然需要)

+0

我想在單個SQL查詢中選擇圖庫和它們的第一張圖像作爲它們的自定義屬性。 第一個示例仍然生成一個+ N個查詢(其中N是庫的數量)。 第二個例子不能存在於我的情況,因爲縮略圖選擇的自定義邏輯... – mktums

+0

因此,描述您的自定義縮略圖選擇... – aherok

+0

它甚至不是選擇,而是填充'Image'和'Gallery'模型是完全獨立和分離的(這就是爲什麼'圖像'字段可以爲空)。 我通過提供'queryset = Gallery.objects.prefetch_related('images')。all()'來查看類...但是仍然是2個查詢,而不是一個。 – mktums