django - 我如何按标签名称搜索帖子是否已发布
问题描述
我有两个问题;第一个; 我如何按标签名称搜索标签模型是 manytomanyfield。最后一个; 如果帖子已发布,则按标签名称显示帖子。我使用此代码“post_list=Post.objects.published()”获取已发布的帖子。但是,我不知道如何使用过滤器和发布
模型.py
class Tag(models.Model):
tag_name = models.CharField(max_length=50, unique=True)
tag_slug = models.SlugField(max_length=50, unique=True)
class PostQuerySet(models.QuerySet):
def active(self):
return self.filter(status__in=[Post.STATUS_PUBLISHED])
def published(self):
return self.filter(status=Post.STATUS_PUBLISHED)
class Post(models.Model):
STATUS_DRAFT = 1
STATUS_PUBLISHED = 2
STATUSES = (
(STATUS_DRAFT, 'Draft'),
(STATUS_PUBLISHED, 'Published'),
)
category=models.ManyToManyField(Category)
tag=models.ManyToManyField(Tag)
user=models.ForeignKey(User,on_delete=models.CASCADE,verbose_name="Yazar",related_name='posts')
title=models.CharField(max_length=120,verbose_name="Başlık")
content=RichTextField(verbose_name="İçerik")
created_date=models.DateTimeField(auto_now_add=True,verbose_name="Oluşturulma Tarihi")
updated_date=models.DateTimeField(auto_now=True,verbose_name="Güncellenme Tarihi")
image=models.ImageField(null=True,blank=True)
slug=models.SlugField(max_length=130,unique=True)
status = models.SmallIntegerField(choices=STATUSES)
objects = PostQuerySet.as_manager()
视图.py
def post_index(request):
#post_list=Post.objects.published().order_by('-created_date')
post_list=Post.objects.published()
query=request.GET.get('q')
if query:
post_list=post_list.filter(
Q(content__icontains=query)|
Q(title__icontains=query) |
Q(tag_name__icontains=query)| # doesn't work
Q(user__first_name__icontains=query)).distinct()...
解决方案
它应该是tag__tag_name
(带有两个连续的下划线),并且带有tag_name
,因为这是Tag
模型字段的名称:
def post_index(request):
#post_list=Post.objects.published().order_by('-created_date')
post_list=Post.objects.published()
query=request.GET.get('q')
if query:
post_list=post_list.filter(
Q(content__icontains=query)|
Q(title__icontains=query) |
Q(tag__tag_name__icontains=query)|
Q(user__first_name__icontains=query)
).distinct()
但是,我建议将您的名称重命名tag = ManyToManyField(Tag)
为tags = ManyToManyField(Tag)
,因为 aManyToManyField
会导致对象集合,因此使用复数名称可能会更好。
推荐阅读
- shiny - Dashboard Shiny:刷机无表更新
- azure - Azure 虚拟机规模集 VMSS 重新映像而不中断服务
- reactjs - 如何在javascript中正确制作div选项卡以与reactjs一起使用
- javascript - 在 javascript 中,匹配没有按预期的方式工作
- python - 无法再找到附加到谷歌云实例的 GPU
- ethereum - 试图理解 Infura 的区块头
- vba - 使用 MinGW gcc 为 VBA 64 位创建 DLL
- c# - 使用 SSIS 脚本连接 API 失败
- excel - 使用嵌套的 Do While 语句运行 For 循环,但为什么我的代码会冻结?
- bash - In Terminal - For-loop 将每张连续的 18 张图片拼接成一张图片