一对多:
多方定义外键!!
# 学生模型类
class Student(AbstractUser):
mobile = models.CharField(max_length=11, unique=True, verbose_name='手机号')
cid = models.ForeignKey(to="Class", to_field="id")
class Meta:
db_table = 'tb_student'
verbose_name = '用户'
verbose_name_plural = verbose_name
# 班级模型类
class Class(models.Model):
id = models.AutoField(primary_key=True)
cname = models.CharField(max_length=32)
cdata = models.DateField()
在django中实现多对一的
指定
时,用法如下:
st = Student(
username=student_name,
password=password,
cid=cl # cl为Class类的实例
)
在进行
查找
时:
# 一对多/多对一
cl = Banji.objects.get(id=3)
tea = cl.student_set.all()[0]
print(tea)
print(cl.student_set.first())
st = Student.objects.get(username='fenghua')
print(st.cid_id)
print(st.cid.cname)
关联查询
1.正向查找(多查1):
通过模型类的外键(这里是cid)获取
st.cid_id 查找学生对应的班级id 模型中多方定义外键时有字段to_field=id
st.cid.cname 查找学生对应的班级名称
2.反向查找(1查多):
如果不在外键的字段中设置related_name的话,默认就用多方模型小写_set。
如果设置了related_name=”students”,反向查询时可直接使用students进行反向查询
cl(假设时班级对象)
cl.模型名小写_set.first()
cl.students.first()
内连接查询
由多模型类条件查询一模型类数据
:
语法如下:
关联模型类名小写__属性名__条件运算符=值
注意:如果没有"__运算符"部分,表示等于。
例:
查询班级,要求学生为"XX"
Class.objects.filter(student__username=
'XX'
)
查询班级,要求班级中学生的名字包含"X"X
Class.objects.filter(student__username__contains=
'X'
)
由一模型类条件查询多模型类数据
:
(
有
外键
用外键作为条件
)
语法如下:
外键
__一模型类属性名__条件运算符=值
注意:如果没有"__运算符"部分,表示等于。
例:
查询班级为“XX”的所有学生。
Student.objects.filter(
cid
__cname=
'天龙八部'
)
查询班级人数大于30的所有学生
Student.objects.filter(
cid
__cnum__gt=
30
)
多对多查找
多对多操作
正向查询(由老师表查询班级表)
# 班级模型类
class Banji(models.Model):
id = models.AutoField(primary_key=True)
cname = models.CharField(max_length=32)
cdata = models.DateField()
cnum = models.IntegerField()
def __str__(self):
return "%s" % [self.__class__, self.cname]
class Meta:
db_table = 'tb_banji'
verbose_name = '班级'
verbose_name_plural = verbose_name
# 老师模型类
class Teacher(models.Model):
id = models.AutoField(primary_key=True)
tname = models.CharField(max_length=32)
cid = models.ManyToManyField(to="Banji", name="teacher")
class Meta:
db_table = 'tb_teacher'
verbose_name = '老师'
verbose_name_plural = verbose_name
# 多对多
te = Teacher.objects.get(id=4)
cl1 = te.teacher.all()[0]
cl2 = te.teacher.all()[1]
print(cl1.cname)
print(cl2.cname)
cl = Banji.objects.get(id=3)
te1 = cl.teacher_set.all()[0]
te2 = cl.teacher_set.all()[1]
print(te1.tname)
print(te2.tname)
查出老师模型类对象.多对多的键(这里是cid).all()
te.cid.all()
te.teacher.all()
teacher是cid设置的name属性,用于对接查找班级
反向查询(由班级表反向查询老师表)
班级模型类对象.老师模型类小写_set
cl.teacher
_set
.all()