具有多个字段的模型中的查询集(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)

但是,您对字段使用的命名约定也有点古怪。我已经使用了下面的最佳实践,因此您可以看到它的外观。

  1. 没有与模型同名的字段
  2. 模型应该是单数的(极少数例外)
  3. 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)的主要内容,如果未能解决你的问题,请参考以下文章

Django:具有多个查询集的 jQuery 自动完成

Django 查询集过滤具有相同多对多字段的对象

在 django 中获取具有多对多关系的复杂查询集

具有三层深度嵌套模型的查询集过滤器(多个一对多关系)

具有特定字段的自定义查询集的 Django ModelForm 实例

如何使用格式化的日期时间字段获取 django 查询集结果