'QuerySet'对象没有属性ERROR,试图获取ManyToMany字段的相关数据

mgP*_*ePe 13 django django-models manytomanyfield

我有以下型号:

class Tag(models.Model):
    tag_name = models.CharField(max_length=250)
    tagcat = models.ForeignKey('TagCat')

class Subject(models.Model):
    user = models.ManyToManyField(User)
    tags = models.ManyToManyField(Tag)

class TagCat(models.Model):
    cat_name = models.CharField(max_length=100)
Run Code Online (Sandbox Code Playgroud)

所以我有一个主题,有一个标签.我想循环主题及其相应的标签,所以我试图构建正确的视图.到目前为止,我有:

def home(request):
    user1 = Subject.objects.filter(id=1)
    print(user1.tags.all())
Run Code Online (Sandbox Code Playgroud)

我希望通过这个print语句获取用户的标签,但我得到错误

'QuerySet'对象没有属性'tags'

如何使用各自的标签获取"主题"对象并将其传递给模板?

(理想情况下是所有科目.我在这里只做了一个,以简化故障排除过程)

Dan*_*olo 26

filter返回QuerySet(如你可能已经猜到了),你想要做的get,而不是

user1 = Subject.objects.get(id=1)
Run Code Online (Sandbox Code Playgroud)

如果Subject不存在,您将获得一个Subject.DoesNotExist例外.如果您只是抓取要以某种方式显示的对象并且如果它不可用则返回404,那么还有一个get_object_or_404快捷方式django.shortcuts很有用.

  • 但是`filter`并没有真正让你成为用户,它会得到另一个`QuerySet`,它描述了从你的对象集(`Subject.objects`)中选择一组`Subject`的标准.可以将其视为表格与表格中行之间的差异.`QuerySet描述了对象是行的表.在您的情况下,您的`QuerySet`只是一行表.`get`唯一标识对象集之外的对象并返回该对象而不是单行表. (3认同)
  • 如果你想要多个东西,你可以使用`filter`,然后你可以迭代它.`for Subject.objects.filter中的用户([你的过滤条件]):`每次迭代都会在`user`变量中给你一个`Subject`对象.该变量将具有您寻求的所有属性! (3认同)