Django中ManyToMany自关联字段parent显示为None问题
Django多对多自关联字段显示parent为None的问题
我在Django中创建了如下模型:
class Content(models.Model): publish_date = models.DateTimeField(auto_now_add=True) name = models.CharField(max_length = 100, blank = False, default='name') summary = models.CharField(max_length=400, blank=True, default='summary') description = models.TextField(blank = True, max_length=5000, default = LOREM_IPSUM) author = models.ForeignKey(User, default=None, on_delete=models.CASCADE) rules = models.TextField(blank = True, default='rule set') parent = models.ManyToManyField(to = 'self', related_name="child", symmetrical = False, blank=True)
通过Django后台添加了四个Content对象:
- Project1
- Task1
- Task2
- Task3
并为所有TaskX设置parent为Project1,但尝试显示parent属性时,结果显示为None。
views.py代码:
def display_ideas(request): ideas = Content.objects.filter(name="Task3") return render(request, 'display_ideas.html', context = { 'ideas' : ideas })
display_ideas.html模板代码:
<div class="container bg-success"> {% for idea in ideas %} <div class="container bg-danger"> <h2>Name:</h2> {{ idea.name }} has parent: {{ idea.parent.name }} </div> {% endfor %} </div>
输出结果:
Name:
Task3 has parent: None
所有迁移已完成,网站正常运行,请问哪里操作错了?
问题原因及解决方案
核心问题
你用{{ idea.parent.name }}访问多对多字段是错误的——parent是ManyToManyField,调用idea.parent返回的是QuerySet对象集合,而不是单个模型实例,直接访问.name自然会返回None。
方案一:改用ForeignKey(更符合业务逻辑)
从你的业务场景看,每个Task只属于一个Project,而一个Project可以有多个Task,这种一对多关系应该用ForeignKey而非ManyToManyField,修改模型如下:
class Content(models.Model): # 其他字段保持不变 parent = models.ForeignKey( to='self', related_name="children", # 复数更符合语义 symmetrical=False, blank=True, null=True, on_delete=models.SET_NULL # 父级删除时子级设为null,可根据需求调整 )
修改后执行迁移,后台重新设置关联,模板中{{ idea.parent.name }}就能正常显示父级名称。
方案二:保留ManyToManyField的修复方式
如果必须保留多对多关联(比如允许一个Task属于多个Project),模板中需要遍历父级集合,或者取第一个关联的父级:
<!-- 遍历所有父级 --> {{ idea.name }} has parents: {% for parent in idea.parent.all %} {{ parent.name }} {% endfor %} <!-- 只取第一个父级 --> {{ idea.name }} has parent: {{ idea.parent.first.name }}
内容的提问来源于stack exchange,提问作者Wincij
相关产品推荐
相关产品推荐

