2016-10-21 43 views
1

我有可以與圖像和位置相關聯的標籤。如何使用ORM作爲SQL計數,組和連接查詢的等價物?

  • 標籤是獨一無二的。
  • 圖像和位置可以有很多標籤。
  • Tag_Item模型用於將所有內容鏈接在一起。

下面是型號:

LOCATIONS = (
    ('US', 'USA'), 
    ('UK', 'United Kingdom'), 
    ('FR', 'France'), 
) 

class Location(models.Model): 
    location = models.CharField(choices=LOCATIONS) 

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

class Tag(models.Model): 
    tag = models.CharField(max_length=150, unique=True) 

class Tag_Item(models.Model): 
    tag = models.ForeignKey(Tag, on_delete=models.CASCADE)  
    location = models.ForeignKey(Location, null=True, blank=True, default=None) 
    image = models.ForeignKey(Image, null=True, blank=True, default=None) 
    created_at = models.DateTimeField(auto_now_add=True) 

我想編寫一個查詢,這意味着選擇五種最常見的標籤爲美國

我在想大意如下的東西在SQL:

  • 加入標籤,Tag_Item和位置,其中位置是「美」。
  • 按標籤分組。
  • 通過Tag_ID(或沿着這些線的東西)對它進行排序。

但我無法弄清楚如何在Django ORM中傳輸。

你能幫我解釋一下這種複雜的關係查詢嗎?

+2

看看註釋和聚合https://docs.djangoproject.com/el/1.10/topics/db/aggregation/ – Johan

+0

嘿,@TomBrock我想知道,你發現我的答案有幫助嗎? –

回答

0

您將需要幾件事情,開始了這樣的查詢:


您可以簡化您的描述查詢:

from django.db.models import Count 

usa_tags = Tag_Item.objects.filter(location__location='US') 
          .values('tag__tag__id') 
          .annotate(my_count=Count('tag__tag__id') 
          .order_by('my_count') 

這將返回一個有序字典誰是第一個條目是頂部標籤第二項在使用中等等。第二個標籤:

tag_id | my_count 
-------|--------- 
    5 | 101 
    1 | 53 
    ... | ... 

現在您可以從該字典中檢索五個頂級標記。