2017-05-31 2 views
1

検索バーをクリックするとランダムなタグの提案をユーザーに与えたいと思います。これまでのところ私のコードは、私が望むものを返すが、Post IEに割り当てられていないタグも返す。投稿を削除したりタグを削除したりすると、それらのタグはまだ提案に表示されている。Django-Taggitは、投稿に割り当てられていないものをスキップするランダムタグを取得します。

# Get the suggestions (In View) 
suggestions = Tag.objects.all().distinct().order_by('?')[:5] 

# Model 
class Post(models.Model): 
title = models.CharField(max_length=256) 
disclaimer = models.CharField(max_length=256, blank=True) 
BLOGS = 'blogs' 
APPLICATIONS = 'applications' 
GAMES = 'games' 
WEBSITES = 'websites' 
GALLERY = 'gallery' 
PRIMARY_CHOICES = (
    (BLOGS, 'Blogs'), 
    (APPLICATIONS, 'Applications'), 
    (GAMES, 'Games'), 
    (WEBSITES, 'Websites'), 
) 
content_type = models.CharField(max_length=256, choices=PRIMARY_CHOICES, default=BLOGS) 
screenshot = models.CharField(max_length=256, blank=True) 
tags = TaggableManager() 
body = RichTextField() 
date_posted = models.DateTimeField(default=datetime.now) 
date_edited = models.DateTimeField(blank=True, null=True) 
visible = models.BooleanField(default=True) 
nsfw = models.BooleanField() 
allow_comments = models.BooleanField(default=True) 
files = models.ManyToManyField(File, blank=True) 

def __str__(self): 
    if (self.visible == False): 
     return '(Hidden) ' + self.title + ' in ' + self.content_type 
    return self.title + ' in ' + self.content_type 

答えて

0

あなたは彼らのタグの記事を照会し、これらの5を選択する必要が投稿するために割り当てられたタグのみたい場合:

allposts = Post.objects.all() 
five_tags = list(set([tag.slug for post in allposts for tag in post.tags.all()]))[:5] 

を(重複を削除するset()を使用)

編集

5つを選択する前にすべてのタグをシャッフルしたい場合は、

import random 

allposts = Post.objects.all() 
all_tags_list = list(set([tag.slug for post in allposts for tag in post.tags.all()])) 
random.shuffle(all_tags_list) 
five_tags = all_tags_list[:5] 
+0

2番目のビットは、私が望むことをしますが、代わりにスペースを持つタグを返す理由と、なぜ小文字しか返さないのか知っていますか? – Anon

+0

tag.slugをtag.nameに置き換えて気にしないでください。 – Anon

関連する問題