【问题标题】:How to get list of tags related to any Blogpost in model - Django如何获取与模型中的任何博客文章相关的标签列表 - Django
【发布时间】:2021-11-22 02:10:58
【问题描述】:

所以我有两个模型:

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 关系的标签:['games']

然后我想获取已在任何对象 BlogPost 模型中使用的标签列表,如 ['movie','documentary','games']。

我找不到这个问题的答案。有没有办法查询这个问题?

【问题讨论】:

    标签: python django django-models many-to-many relationship


    【解决方案1】:

    如果你想要一个查询集,试试这个。

    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)))
    

    【讨论】:

      【解决方案2】:

      如果你想要一个键值对列表,你可以使用第一个代码块,如果你想从列表中解压值使用第二个代码块。

      # 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)
      

      【讨论】:

        【解决方案3】:

        我还为我的问题找到了另一个解决方案:

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

        这样我也可以使用 Tag 模型对象并在查询集中给出唯一的标签。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-06-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-03
          • 2020-10-18
          • 1970-01-01
          • 2019-08-06
          相关资源
          最近更新 更多