我强烈建议您使用
related_name
属性我添加了
_x
以使查询更加明显。
class Items(models.Model):
item = models.TextField()
def __str__(self):
return self.item
class Categories(models.Model):
category = models.CharField(max_length=50,null=True)
items_associated = models.ManyToManyField(Items, related_name='category_x')
def __str__(self):
return self.category
class Professors(models.Model):
professor = models.CharField(max_length=50,null=True)
categories_assigned = models.ManyToManyField(Categories, related_name='professor_x')
def __str__(self):
return self.professor
class Students(models.Model):
student_logged = models.CharField(max_length=50,null=True)
professors_to_evaluate = models.ManyToManyField(Professors, related_name='student_x')
def __str__(self):
return self.student_logged
items_for_student = Items.objects.filter(category_x__professor_x__student_x=student)
但是,您用于字段的命名约定也有点奇怪。我已经使用了下面的最佳实践,所以您可以看到它是什么样子。
-
没有与模型同名的字段
-
模型应该是单一的(很少有例外)
-
ManyToMany或ForeignKey关系应该共享模型的名称,以便查询自己的文档。
根据这些规则,这里就是最佳实践。
class Item(models.Model):
name = models.TextField()
def __str__(self):
return self.name
class Category(models.Model):
name = models.CharField(max_length=50,null=True)
items = models.ManyToManyField(Item, related_name='categories')
def __str__(self):
return self.name
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_names='students')
def __str__(self):
return self.name
使用该结构,查询将如下所示:
items = Item.objects.filter(categories__professors__students=student)
还请注意,上述查询将
非常
在数据库上运行非常昂贵,因为它需要计算3个连接。