博客信息

Python Django 模型层(关联关系)

发布时间:『 2019-08-08 10:28』  博客类别:Python  阅读(672)

一对一

 

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


小李飞刀_Python


小李飞刀_Python



注意:上面是没有改动原有的model类的情况下,如果改动了原有model类的话,该进行以下操作;


小李飞刀_Python


小李飞刀_Python


工程中的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')


小李飞刀_Python


多对多

新增一个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('小李飞刀', '语文', '数学')


小李飞刀_Python


最终数据库来几张截图


小李飞刀_Python

小李飞刀_Python


over......


关键字:     Python       Django       关联关系  

备案号:湘ICP备19000029号

Copyright © 2018-2019 javaxl晓码阁 版权所有