代码之家  ›  专栏  ›  技术社区  ›  anon

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

  •  0
  • anon  · 技术社区  · 8 年前

    我的问题是对跨多对多领域互连的模型进行查询集。

    上下文-一个学生输入的应用程序,必须对其老师进行评分。应用程序向学生展示的问题有以下逻辑:每个学生必须给一些老师打分。每个教师都有不同类别的相关问题(“智力”、“尊重”、“同理心”等),每个类别都有一些相关问题。

    模型包括:

    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
    

    当学生进入网络时,有一些相关的老师(模范学生),这些老师依次分配了一些类别(模范教授),这些类别又有一些相关的问题(模范类别)。 我想将模型项中的这些问题存储在字典中。 我该怎么做?

    我已尝试筛选并\uu加入,但无法获得它。

    非常感谢你的智慧

    1 回复  |  直到 6 年前
        1
  •  0
  •   bzmw    8 年前

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

    推荐文章