2017-12-18 94 views
0

我在我的應用程序中擁有itens,我想通過「流行度」返回它。這種受歡迎程度意味着該項目的觀看次數。 我使用django-hitcount來做到這一點。我看到了here我如何獲得每個對象的命中數。但是我不想將所有的Item對象加載到內存中來完成我想要的操作,因爲這是不必要的重載。 我想返回N個最受歡迎的itens傳遞給視圖和每個項目的訪問號碼。如何通過使用django-hitcount計算的流行度來返回對象

我的項目模型爲波紋管

class Item(models.Model, HitCountMixin): 
    nome = models.CharField(max_length=255, unique=True) 
    slug = models.SlugField(max_length=255, null=True) 
    imagem = models.ImageField(upload_to='itens/item/', null=True, blank=True) 
    descricao = RichTextUploadingField(null=True, blank=True) 
    categoria = models.ForeignKey(Categoria) 
    hit_count_generic = GenericRelation(
     HitCount, object_id_field='object_pk', 
     related_query_name='hit_count_generic_relation') 

    def __str__(self): 
     return '{}'.format(self.nome) 

    def get_absolute_url(self): 
     from django.urls import reverse 
     return reverse('itens:detail_item', args=[str(self.slug)]) 

起初,我認爲我是想用這個功能

def get_most_popular_itens(amount): 
    return Item.objects.order_by('-hit_count.hits')[:amount] 

得到最流行的itens但沒有奏效。我無法理解這種內容類型/通用關係是如何工作的。 因此,我看到了數據庫表是如何被管理並做功能的(見下文)。 但它有一個問題。返回的查詢集不按視圖數量排序,我無權訪問此數字。 更重要的是,在我看來,我的解決方案至少是不好的。 因此,我想知道如何改進這一點,或許從通用關係中獲得一些優勢?

def get_most_popular_itens(amount): 
    ct = ContentType.objects.get_for_model(Item) 
    hit_counts = HitCount.objects.filter(content_type_id=ct.id).order_by('-hits')[:amount] 
    items = [] 
    for hit in hit_counts: 
     items.append(hit.object_pk) 
    return Item.objects.filter(id__in=items) 

回答

0

這應該工作:

Item.objects.all().order_by('-hit_count_generic__hits') 
+0

它給我這個錯誤:無法解析關鍵字 'hit_count_generic_relation' 到現場。選擇是:categoria,categoria_id,comercializa,descricao,hit_count_generic,id,imagem,item_faz_receita,item_produto_receita,nome,npc_comercializa_item,slug –

+0

感謝您的編輯。我正在使用反向關係的關鍵,在這種情況下,這是錯誤的。 – Tim

+0

它沒有工作。我有兩個對象,每個對象有兩個,但是當我做Item.objects.all()。order_by(' - hit_count_generic__hits')[:10]時,它們不在結果中(我的其他對象都只有一個視圖) –

相關問題