【发布时间】:2018-10-29 04:37:24
【问题描述】:
我正在开发一个应用程序,学生可以在其中评估他们的老师。我有几个模型,但这个问题的重要模型是:
class Professor(models.Model):
name = models.CharField(max_length=50,null=True)
categories = models.ManyToManyField(Category, related_name='professors')
def __str__(self):
return self.name
class Student(models.Model):
name = models.CharField(max_length=50,null=True)
professors = models.ManyToManyField(Professor, related_name='students',through='Studentprofesor' )
def __str__(self):
return self.name
class Studentprofesor(models.Model):
student = models.ForeignKey(Student, on_delete=models.CASCADE)
professor = models.ForeignKey(Professor, on_delete=models.CASCADE)
tested = models.BooleanField(default=False)
据我所知,get 和 filter 之间的主要区别在于,当有多个对象具有我正在寻找的功能时,我无法使用 get。但除此之外,他们以类似的方式工作。 get 用于单个对象,filter 用于多个对象。
但是,在这种情况下,当我运行 get 和 filter 时会得到不同的结果。
如果我使用get:
Student.objects.get(name="Mike").professors.all()
我得到:
<QuerySet [<Professor: Tom>, <Professor: Jenn>]>
但是如果我使用filter:
Student.objects.filter(name="Mike").professors.all()
我得到:
AttributeError: 'QuerySet' object has no attribute 'professors'
好像过滤器无法遵循对象之间的多对多关系。
为什么会这样?
【问题讨论】:
-
因为有多个。
.get(..)立即获取单个实体,而过滤器不过滤,除非您强制执行查询。
标签: django django-queryset django-orm django-filter