【问题标题】:Iterate over ManyToMany field Django迭代ManyToMany字段Django
【发布时间】:2020-12-08 02:11:01
【问题描述】:

我在遍历 ManyToMany 字段时遇到了一些问题。 我想要一个 Post 和 Tag 模型,并让 Post 模型以 ManyToMany 关系的形式扩展 Tag 模型。

下面是我的Tag 和Post 模型。

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

    def __str__(self):
        return f"{self.name}"

class Post(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=150)
    content = RichTextField()
    timestamp = models.DateTimeField(auto_now_add=True)
    slug = models.SlugField(unique=True,default="",max_length=1000)
    tag = models.ManyToManyField(Tag,related_name='tags',blank=True)

    # .... other non related functions

但是,当我在 Django shell 中时,我似乎无法遍历这些标签,尽管对象具有与之关联的标签。

例如,我会先输入post1 = Post.objects.all()[0],然后再输入post1.tag.name.all(),但会出现错误提示"AttributeError: 'NoneType' object has no attribute 'all'

我尝试过的所有其他方法都失败了。有什么办法可以解决这个问题?

提前谢谢你

【问题讨论】:

  • 删除.name!
  • 将此作为答案,我将其标记为正确。我不能我没有想到那个 lmao 再次感谢!

标签: python django django-models django-templates


【解决方案1】:

你应该像这样遍历标签对象

for tag in post1.tag.all():
   print(tag.name)

【讨论】:

    【解决方案2】:

    对ManyToManyField进行迭代非常简单

    for tag in post1.tag.all():
       print(tag.name)
    

    除了迭代,我还有一些其他的建议。喜欢 tag 会有很多标签,所以将其命名为 tags 更合适。其次,related_name 是 用于从相关对象到此对象的关系的名称所以在您的情况下,它应该是 posts 而不是 tags

    所以它看起来像

    tags = models.ManyToManyField(Tag, related_name='posts', blank=True)
    

    现在您可以使用此related_name 从任何特定标签访问帖子。例如,如果你有标签

    tag1 = Tag.objects.all()[0]
    

    现在您可以使用以下行获取所有带有此标签的帖子

    tag1_posts = tag1.posts.all()
    

    【讨论】:

      猜你喜欢
      • 2022-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 2020-02-18
      • 2018-05-05
      • 2015-10-25
      • 2021-06-07
      相关资源
      最近更新 更多