一对一
在models.py文件中新增两个类
# 学生 和 学生证的关系 1:1 class Student(models.Model): # 学号 sno = models.AutoField(primary_key=True) # 学生姓名 sname = models.CharField(max_length=30, unique=True) class Meta: db_table = 't_student' def __unicode__(self): return u'%s' % self.sname class Scard(models.Model): # 学号:主键,级联删除 sno = models.OneToOneField(Student, primary_key=True, on_delete=models.CASCADE) # 学院 department = models.CharField(max_length=50) # 专业 major = models.CharField(max_length=20) # 进班时间 enterDate = models.DateField() class Meta: db_table = 't_scard' def __unicode__(self): return u'Scard:%s,%s' % (self.sno.sname, self.major)
重新生成迁移文件
python manage.py makemigrations stu
执行迁移文件
python manage.py migrate
注意:上面是没有改动原有的model类的情况下,如果改动了原有model类的话,该进行以下操作;
工程中的stu/0001_initial这个迁移文件也干掉
原有的同一app下的表做好备份后全部删掉
然后重新执行命令
python manage.py makemigrations stu
python manage.py migrate
接下来在Python console中进行测试
from stu.models import * stu = Student(sname='zs') stu.save() scard = Scard(sno=stu,department='计算机科学与技术系',major='计算机及应用',enterDate='2018-9-1') scard.save() Scard.objects.first().sno <Student: zs> Student.objects.first() <Student: zs>
一对多
新增一个app onetomany
python manage.py startapp onetomany
Setting.py中配置
python manage.py makemigrations onetomany
python manage.py migrate
新增模型类
# Create your models here. # 班级 和学生 1:n class Clazz(models.Model): cno = models.AutoField(primary_key=True) cname = models.CharField(max_length=30) def __unicode__(self): return u'Clazz:%s--%s' % (self.cname) # Create your models here. # 学生 和 学生证的关系 1:1 class Student(models.Model): # 学号 sno = models.AutoField(primary_key=True) # 学生姓名 sname = models.CharField(max_length=30, unique=True) # 所在班级 clazz = models.ForeignKey(Clazz, related_name='student') def __unicode__(self): return u'%s' % self.sname
控制台测试
from onetomany.models import * clz1=Clazz.objects.create(cname='java') clz2=Clazz.objects.create(cname='python') Student.objects.create(sname='zs',clazz=clz1) <Student: zs> Student.objects.create(sname='ls',clazz=clz1) <Student: ls> Student.objects.create(sname='ww',clazz=clz2) <Student: ww> Student.objects.first().clazz.cname u'java' Clazz.objects.first().student.all() <QuerySet [<Student: zs>, <Student: ls>]>
可以封装函数,一次给两张表添加数据
def insertData(clsname,*snames): try: cls = Clazz.objects.get(cname=clsname) except Clazz.DoesNotExist: cls = Clazz.objects.create(cname=clsname) for sn in snames: try: stu = Student.objects.get(sname=sn) except Student.DoesNotExist: Student.objects.create(sname=sn,clazz=cls) insertData('t224','wangwang','taidi')
多对多
新增一个app manytomany
python manage.py startapp manytomany
Setting.py中配置
python manage.py makemigrations manytomany
python manage.py migrate
模型类创建
# 课程表 和 教师表 n:n class Course(models.Model): course_id = models.AutoField(primary_key=True) course_name = models.CharField(max_length=30, unique=True) def __unicode__(self): return u'Course:%s' % self.course_name class Teacher(models.Model): tid = models.AutoField(primary_key=True) tname = models.CharField(max_length=30, unique=True) course = models.ManyToManyField(Course) def __unicode__(self): return u'Teacher:%s--%s' % (self.tname, self.course)
控制台测试
from manytomany.models import * cour1 = Course(course_name='Java') cour1.save() cour2 = Course(course_name='Python') cour2.save() t1 = Teacher(tid='1001',tname='晓哥') t1.save() t2 = Teacher(tname='帆哥') t2.save() t3 = Teacher(tname='胡哥') t3.save() t1.course.add(cour1) t2.course.add(cour2) t3.course.add(cour1,cour2) Course.objects.first().teacher_set.all() <QuerySet [<Teacher: Teacher:晓哥--manytomany.Course.None>, <Teacher: Teacher:胡哥--manytomany.Course.None>]> Teacher.objects.first().course.all() <QuerySet [<Course: Course:Java>]>
多对多封装函数的玩法
def insertData(tname, *coursenames): cour_name = [] for c in coursenames: try: cour = Course.objects.get(course_name=c) except Course.DoesNotExist: cour = Course.objects.create(course_name=c) cour_name.append(cour) t = Teacher(tname=tname) t.save() t.course.add(*cour_name) insertData('小李飞刀', '语文', '数学')
最终数据库来几张截图
over......
备案号:湘ICP备19000029号
Copyright © 2018-2019 javaxl晓码阁 版权所有