关系表
模型创建
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![](https://i-blog.csdnimg.cn/blog_migrate/942b785e0cf47ee758251c01be289d3b.png)
通过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对象: 用于比较同一个模型中的两个字段的值![](https://i-blog.csdnimg.cn/blog_migrate/5efe6c99652640871655ff3d598f73be.png)
Q对象
用于处理多条件中的逻辑关系 and or not