2017-12-18 95 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]时,它们不在结果中(我的其他对象都只有一个视图) –

相关问题