Django(五):数据表多对多关系建立、增删改查、聚合查询、 F、Q对象

关系表

模型创建

class Person(models.Model):
    # id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32,verbose_name="姓名")
    age = models.IntegerField(verbose_name="年龄")
    height = models.DecimalField(max_digits=5,decimal_places=2,verbose_name="身高",null=True)
    birthday = models.DateField(verbose_name="生日",auto_now=True)

    def __str__(self):
        return str(self.name)

    class Meta:
        db_table = 'person'
        verbose_name = "用户"
        verbose_name_plural = verbose_name
        # ordering= ['-age','id','name']

class Teacher(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField(default=0)
    gender = models.CharField(max_length=8)
    person = models.ManyToManyField(to=Person)
    class Meta:
        db_table = 'teacher'

查看数据库

增加

 

    # 新学员  秦秦 想学 laozhang 课  create  正向操作
    # teacher_obj = Teacher.objects.filter(name='laozhang').first()
    # teacher_obj.person.create(name="秦秦",age=16,height=192)
    # 老学员张三  想学 laowang 的课  创建关系的操作   正向操作
    # teacher_obj = Teacher.objects.filter(name='laowang').first()
    # person_obj = Person.objects.filter(name="zhangsan").first()
    # teacher_obj.person.add(person_obj)

    ## 反向操作
    teacher_obj = Teacher.objects.filter(name="laoliu").first()
    person_obj = Person.objects.filter(name="秦秦").first()
    person_obj.teacher_set.add(teacher_obj)

查询

def manytomanyget(request):
    ## 正向  反向
    
    ## 正向查询
    #  查到老师信息,寻找这个老师教的所有学生
    # teacher_obj = Teacher.objects.filter(name='laoliu').first()
    # person = teacher_obj.person.all()
    # print (person)
    ## 查到学生的信息,寻找该学生的老师
    ## 反向查询
    person_obj = Person.objects.filter(name='秦秦').first()
    teacher_obj = person_obj.teacher_set.all().values()
    print (teacher_obj)

    return HttpResponse("多对多查询")

更改

def manytomanyupdate(request):
    # 修改老刘交的学生    10 3   改成  老刘只交id为 1 2 3 4 5 学生
    # 正向  从外键所在表 -》 关联表    teacher -》 person
    # 第一种
    # teacher_obj = Teacher.objects.filter(name="laoliu").first()
    # teacher_obj.person.set([1,2,3,4,5])
    # 第二种
    # teacher_obj = Teacher.objects.filter(name="laoliu").first()
    # person1 = Person.objects.filter(name="java").first()
    # person2 = Person.objects.filter(name="秦秦").first()
    # ## set 后面要放一个 列表,列表中可以是id 还可以是 对象
    # teacher_obj.person.set([person1,person2])

    ## 反向修改
    # 第一种
    # person_obj = Person.objects.filter(name='java').first()
    # person_obj.teacher_set.set([2])
    # 第二种   放对象   
    person_obj = Person.objects.filter(name='java').first()
    teacher1 = Teacher.objects.filter(name="laoliu").first()
    teacher2 = Teacher.objects.filter(name="laowang").first()
    person_obj.teacher_set.set([teacher1,teacher2])

删除

    # remove() 解除对象之间的关系
    # 正向操作
    # 秦秦同学 不学老张的课了
    # person_obj = Person.objects.filter(name='秦秦').first()
    # teacher_obj = Teacher.objects.filter(name="laozhang").first()
    # teacher_obj.person.remove(person_obj)

    # 反向操作
    # teacher_obj = Teacher.objects.filter(name="laoliu").first()  ## 查询教师数据
    # person_obj = Person.objects.filter(name='zhangsan').first()  ## 查询学生数据
    # person_obj.teacher_set.remove(teacher_obj)



    # delete() 删除对象数据,以及对象之间的关系
    # laoliu 离职
    # Teacher.objects.filter(name="laoliu").first().delete()

    #  java 同学 退学了
    Person.objects.filter(name="java").first().delete()

聚合查询 avg sum max min count

通过aggregate调用聚合函数

aggregate () 是一个queyset的方法,意思是:返回一个包含数据的键值对的字典

键名:聚合值的表示符号,值:聚合函数计算的结果。

def jttest(request):
    data = Person.objects.all().aggregate(Avg("age"))
    print(data)
    data = Person.objects.all().aggregate(avg_age = Avg("age"),sum_age = Sum("age"))
    print (data)

    return HttpResponse("集合查询")

F对象 Q对象

F对象: 用于比较同一个模型中的两个字段的值

 

 

Q对象

用于处理多条件中的逻辑关系 and or not

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django中的多对多关系是一种常见的关系类型,用于表示两个实体之间的复杂关系。下面是使用Django进行多对多关系增删改查的方法: 增加数据: 1. 首先,在models.py文件中定义多对多关系的模型类。例如,创建一个Student和Course之间的多对多关系,则可以使用类似以下的代码: ```python class Student(models.Model): name = models.CharField(max_length=100) courses = models.ManyToManyField(Course) class Course(models.Model): name = models.CharField(max_length=100) ``` 2. 在视图函数中,可以通过如下代码来向多对多关系添加数据: ```python def add_course_to_student(request, student_id, course_id): student = Student.objects.get(id=student_id) course = Course.objects.get(id=course_id) student.courses.add(course) ``` 删除数据: 1. 可以使用如下代码从多对多关系中删除数据: ```python def remove_course_from_student(request, student_id, course_id): student = Student.objects.get(id=student_id) course = Course.objects.get(id=course_id) student.courses.remove(course) ``` 修改数据: 1. 更新多对多关系中的数据可以使用如下代码: ```python def update_course_of_student(request, student_id, old_course_id, new_course_id): student = Student.objects.get(id=student_id) old_course = Course.objects.get(id=old_course_id) new_course = Course.objects.get(id=new_course_id) student.courses.remove(old_course) student.courses.add(new_course) ``` 查询数据: 1. 查询某个学生的课程可以使用如下代码: ```python def get_courses_of_student(request, student_id): student = Student.objects.get(id=student_id) courses = student.courses.all() ``` 2. 查询某门课程的所有学生可以使用如下代码: ```python def get_students_of_course(request, course_id): course = Course.objects.get(id=course_id) students = course.student_set.all() ``` 以上代码提供了使用Django进行多对多关系增删改查的基本方法,可以根据实际需求进行相应的调整和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值