简体   繁体   English

Django-Taggit获取随机标签,跳过那些未分配给帖子的标签

[英]Django-Taggit get random tags skipping those not assigned to a Post

I want to give my users suggestions of random tags when they click on the search bar. 我想在用户点击搜索栏时向用户提供随机标签的建议。 So far my code returns what I want BUT it is also returning tags that are not assigned to any Post IE: when I delete a post or delete its tags those tags are still showing up in the suggestions. 到目前为止,我的代码返回了我想要的内容但是它还返回了未分配给任何Post IE的标签:当我删除帖子或删除其标签时,这些标签仍然出现在建议中。

# 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

If you want only the tags assigned to posts you have to query the posts for their tags and pick five of these: 如果您只想分配给帖子的标签,则必须在帖子中查询其标签,然后选择以下五个:

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

(use set() to remove duplicates) (使用set()删除重复项)

EDIT 编辑

If you want to shuffle all tags before pick five you can do something like: 如果您想在选择五之前对所有标签进行随机播放,您可以执行以下操作:

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]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM