2017-12-18 4 views
0

私のアプリには、「人気」によって返されたいと思うitensがあります。この人気は、アイテムが持つビューの数を意味します。 私はdjango-hitcountを使っています。 here私は各オブジェクトのヒット数をどのように得ることができるかを見ました。しかし、私はそれが不必要なオーバーロードであるため、私が望むものを達成するために、すべてのItemオブジェクトをメモリにロードしたくありません。 N個の最も人気のあるitensをビューに渡し、各アイテムのアクセス番号を返したいと思います。django-hitcountで計算された人気度でオブジェクトを返す方法

マイアイテムのモデルは、私の見解で、私はこの機能

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

で最も人気のあるitensを取得しようとしていた。しかし、それは動作しませんでした、最初に

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)]) 

として怒鳴るです。このcontenttype/generic関係の仕組みを理解できませんでした。 そこで、データベーステーブルがどのように機能していたかを見てきました(下記参照)。 しかし、それには1つの問題があります。返されたクエリーセットはビュー数で並べられていません。この番号にアクセスすることはできません。 さらに、私の解決策は少なくとも悪いと思われます。 私はそれをどのように改善でき、多分一般的な関係からいくつかの利点を享受することを考えましたか?

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_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]を実行すると2つのオブジェクトが2つずつ表示されます。 –

関連する問題