zoukankan      html  css  js  c++  java
  • django--一对多,多对多查询

    假设有表的关系如下:

     1 class Classes(models.Model):
     2     name = models.CharField(max_length=32)
     3     institute = models.CharField(max_length=32)
     4     headteacher = models.ForeignKey("Teacher")
     5     def __str__(self):
     6         return self.name
     7 class Teacher(models.Model):
     8     name = models.CharField(max_length=32)
     9     student_belong = models.ManyToManyField("Students")
    10     def __str__(self):
    11         return self.name
    12 class Students(models.Model):
    13     name = models.CharField(max_length=32)
    14     class_belong = models.ForeignKey("Classes")
    15     def __str__(self):
    16         return self.name
    View Code

      简单来说,就是老师和班级是一对多,和学生是多对多。

    一对多

     class_all = Classes.objects.all() class_one = Classes.objects.get(id=1) 

      得到了两个对象,假设班级中有headteacher这样的查询为正向的查询。

      那么正向:

    tea = class_one.headteacher.name
    
    all_class = class_all.values_list("id","name","headteacher__name")

      tea是通过点的方式直接找到了相关联的老师信息。通过values这种方式则是要用双下划綫__。一般直接使用values结果是字典形式。

      反向:指的是teacher是被关联方里面没有class字段。

     teacher_one = Teacher.objects.get(id=1)

    teacher_all = Teacher.objects.all()

    all_class = teacher_all.values("name","classes__name")   这里class必须是小写。

     class_name = teacher_one.classes_set 

      反向的values里面在写错的时候会报错并提示有几个可选。得知有classes选项。虽然在models的Teacher类中没有这个字段。

      在使用点的时候也有所不同多出了下划线_set的用法。

    多对多  

    有django自动生成多对多表的操作 (也可以自己写)
    author_list = models.Author.objects.values("id","name","m__name") # values 中直接写关系 双下划綫是表示m的name
    print(author_list)
    obj = models.Author.objects.get(id=1)
    增加
    obj.m.add(3)
    obj.m.add(3,4)
    obj.m.add(*[2,3])
    删除
    obj.m.remove(3)
    obj.m.remove(3,4)
    obj.m.remove(*[2,3])
    修改
    obj.m.set([1,2,3]) # 有则覆盖 无则增加
    obj.m.clear()


    反向
    obj = models.Book.objects.get(id=2)

    obj_author = obj.author_set # 拿到作者列表增删改查一样

    自己写的多对多关系表

    1 class T_S(models.Model):
    2     teacher_id = models.ForeignKey(Teacher)
    3     student_id = models.ForeignKey(Student)
    4     class Meta():
    5         unique_together = (
    6              ('teacher_id','student_id'), 
    7      )

      其中meta是将这两个变成联合唯一。防止重复出现。

      自己写第三张关系表的优点在于所有的一对多的操作都可以用在多对多的表中。利于查询等操作。

  • 相关阅读:
    javascript中的this指向
    面向对象和面向过程、对象、类、实例
    javascript
    实例011:养兔子
    day13匿名函数
    实例010:给人看的时间
    python基础学习day12 生成器与推导式
    实例009:暂停一秒输出
    python基础学习day11函数的进阶
    第一部分:趣味算法入门;第八题:冒泡排序(并与选择排序对比)
  • 原文地址:https://www.cnblogs.com/khal-Cgg/p/6178509.html
Copyright © 2011-2022 走看看