如何解决遍历Django的ManyToMany字段
我在遍历ManyToMany字段时遇到一些问题。 我想要一个Post and 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'
我尝试过的所有其他方法都失败了。我该如何解决该问题?
提前谢谢
解决方法
您应该像这样遍历标签对象
for tag in post1.tag.all():
print(tag.name)
,
迭代到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()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。