具有多个字段的模型中的查询集(Django)

问题描述 投票:0回答:1

我的问题与在多个到多个字段之间互连的模型上创建查询集有关。

上下文 - 学生进入的应用程序,必须为他或她的老师评分。应用程序显示学生的问题具有以下逻辑:每个学生必须评价一些教师。每个教师都有与他们相关的不同类别的问题(“智力”,“尊重”,“同理心”等),并且每个类别都有一些与之相关的问题。

模型是:

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指定的类别向他展示一些不同的问题。

django django-models many-to-many django-queryset
1个回答
0
投票

我强烈建议你使用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个连接。

© www.soinside.com 2019 - 2024. All rights reserved.