具有多个字段的模型中的查询集(Django)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了具有多个字段的模型中的查询集(Django)相关的知识,希望对你有一定的参考价值。
我的问题与在多个到多个字段之间互连的模型上创建查询集有关。
上下文 - 学生进入的应用程序,必须为他或她的老师评分。应用程序显示学生的问题具有以下逻辑:每个学生必须评价一些教师。每个教师都有与他们相关的不同类别的问题(“智力”,“尊重”,“同理心”等),并且每个类别都有一些与之相关的问题。
模型是:
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)
def __str__(self):
return self.category
class Professors(models.Model):
professor = models.CharField(max_length=50,null=True)
categories_assigned = models.ManyToManyField(Categories)
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)
def __str__(self):
return self.student_logged
当一个学生进入网络时有一些相关的教师(模范学生),这些教师又分配了一些类别(模型教授),这些类别又有一些相关的问题(模型类别)。我想在字典中存储模型项中的这些问题。我该怎么做?
我试过过滤和__in,但我无法得到它。
非常感谢并感谢你的智慧
编辑:我会试着给你一个例子,因为我认为这可能有点难以解释。
汤姆 - 学生必须要资格他的老师,他们是瑞克教授和巴尼老师。
将对Rick教授的问题类别进行评估:尊重待遇和技术知识。
尊重待遇的类别有与之相关的问题:
- 老师平等对待每个人
- 老师不说粗鲁的事情
- 老师很善良
技术知识类别有与之相关的问题:
- 他教得很清楚
- 他展示了先进的知识
所以我想要的是,当汤姆学生进入网络评价里克教授时,应用程序会向他显示相关问题,在这种情况下是:
- 老师平等对待每个人
- 老师不说粗鲁的事情
- 老师很善良
- 他教得很清楚
- 展示高级知识
然后当他去评价barney-teacher时,网站会根据barney-teacher指定的类别向他展示一些不同的问题。
我强烈建议你使用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个连接。
以上是关于具有多个字段的模型中的查询集(Django)的主要内容,如果未能解决你的问题,请参考以下文章