Как получить список тегов, связанных с любым Blogpost в модели - Django

Итак, у меня есть две модели:

class Tag(models.Model):
    name = models.CharField(max_length=15)

    def __str__(self):
        return str(self.name)

и

class BlogPost(models.Model):
    title = models.CharField(max_length=255)
    slug = models.SlugField(max_length=255, unique=True, blank=True, null=True)
    author = models.CharField(max_length=255)
    tags = models.ManyToManyField(Tag)
    body = models.TextField(blank=True, null=True)
    snippet = models.TextField(max_length=255)
    status = models.CharField(
        max_length=10, choices=STATUS_CHOICES, default='draft')
    created_on = models.DateTimeField(auto_now_add=True)
    updated_on = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ('-created_on',)

    def __str__(self):
        return str(self.title)

Я пытаюсь получить список тегов, которые были использованы в любом объекте модели BlogPost, т.е. если в базе данных хранятся теги ['movie','entertainment','games','documentary']

и BlogPost A имеет теги с m2m отношением: ['movie','documentary'] и BlogPost B имеет теги с m2m relation:['games']

Затем я хочу получить список тегов, которые были использованы в любом объекте BlogPost модели как ['movie','documentary','games'].

Я не смог найти ответ на этот вопрос. Есть ли способ запросить его?

попробуйте это, если вы хотите иметь кверисет.

BlogPost.objects.all().values_list('tags__name',flat=True)

попробуйте это, если вы хотите иметь список.

list(BlogPost.objects.all().values_list('tags__name',flat=True))

попробуйте это, если вы хотите иметь уникальное значение всех тегов

list(set(BlogPost.objects.all().values_list('tags__name',flat=True)))

Если вам нужен список в парах ключ-значение, вы можете использовать первый блок кода, а если вы хотите распаковать значения из списка, используйте второй блок кода.

# To get the tags in list
posts = BlogPost.objects.all()
for post in posts:
    tags = post.tags.values("name")
    print(tags) 

# To unpack the values
for post in posts:
    for tag in post.tags.all():
        print(tag.name)

За любой помощью, дайте мне знать. Счастливого кодирования.

Я также нашел другое решение своего вопроса :

queryset = Tag.objects.filter(blogpost__id__isnull=False).distinct()

Таким образом, я могу использовать также объект модели Tag и получить уникальные теги в queryset.

Вернуться на верх