Как я могу искать по имени тега и если опубликовано сообщение - PullRequest
1 голос
/ 02 июля 2019

у меня 2 проблемы; первый; Как я могу искать по тегу имя тега? последний; если сообщение опубликовано, показывать сообщения по имени тега. Я беру опубликованные сообщения, используя этот код "post_list = Post.objects.published ()". Тем не менее, я не знаю, как я могу использовать фильтр и опубликовал

Models.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()

views.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()...

1 Ответ

1 голос
/ 02 июля 2019

Это должно быть 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(<b>tag__tag_name__icontains</b>=query)|
            Q(user__first_name__icontains=query)
        ).distinct()

Однако я бы посоветовалпереименовать ваш tag = ManyToManyField(Tag) в <b>tags</b> = ManyToManyField(Tag), так как ManyToManyField приводит к коллекции объектов, и, таким образом, имя из плюсов, вероятно, лучше.

...