B-1 Django模型系统-表关系及其相关操作

表关系的创建

-OneToOne

  •  外键关联
  •  字段:关联字段OneToOneField
  •  on_delete=models.CASCADE) 级联操作   Student_user中元素删除StudentDettail 也删除
class StudentDettail(models.Model):
    num = models.CharField(max_length=20,default='')
    college = models.CharField(max_length=20,default='')
#外键 
    student= models.OneToOneField(Student_User,on_delete=models.CASCADE)

-OneToMany

  •   ’Many‘位的表中加上一个外键
  •  on_delete=models.SET_DEFAULT,null=True  删除联级不删除下级,并允许有null
grade=models.ForeignKey('Grade',on_delete=models.SET_DEFAULT,null=True)

class Grade(models.Model):
    name=models.CharField(max_length=20)
    num = models.CharField(max_length=20)

-ManyToMany

 中间表(详见下文)

关联表的数据操作

-OneToMany

-正向

外键 定义在模型1中直接通过模型1来控制外键(指向模型2)的操作被称为正向

  •    直接赋值
  •        需要有 允许为空   将其赋值为Nonel s.grade=None  s是这个模型内的一个元素)
  •   直接赋值
  •   直接查 (调用外键关联表的字段时用双下划线)例(Student_User.object.filtergrade__name='xx'))

通过双下划线来实现两表之间的相互操作

-反向

模型2被模型1所外键关联,那么通过模型2去操作模型1被称为反向

通过外键关联返回的关联模型的管理器(模型的小写名’+‘_set’

  •    使用管理器直接赋值(all()方法的只能查到与当前模型元素关联的关联模型元素)
  •        元素.反向管理器.clear()     或者 .remove(响应元素)  
  •   反向无法更改(比如方向改关联元素-又会影响到反向管理器)  
  •         通过反向管理器直接查()

通过反向管理器来实现两表之间的相互操作    

-MnayToMany

在指定了中间表时 addremoveset 都不能用,必须用中间表

-正向

 先获取到中间表在正向调用

-反向

 同正向

 

                   

from django.db import models

# Create your models here.
class Student_User(models.Model):
    name = models.CharField(max_length=30) #字符串
    age =models.SmallIntegerField(default=18) #数字 默认值
    sex= models.SmallIntegerField(default=1)
    qq=models.CharField(max_length=20,null=True,unique=True)#字符串比int好操作
    phone=models.CharField(max_length=20,null=True,unique=True)
    c_time=models.DateTimeField(verbose_name='创建时间',auto_now_add=True) #提示给人看的
    e_time=models.DateTimeField(verbose_name='编辑时间',auto_now=True) #提示给人看的
    grade=models.ForeignKey('Grade',on_delete=models.SET_NULL,null=True)

    def __str__(self):
        return '%s-%s'%(self.name,self.age)

class StudentDetail(models.Model):
    num = models.CharField(max_length=20,default='')
    college = models.CharField(max_length=20,default='')
    student= models.OneToOneField('Student_User',on_delete=models.CASCADE)
class Grade(models.Model):
    name=models.CharField(max_length=20)
    num = models.CharField(max_length=20)
    def __str__(self):
        return '%s-%s' % (self.name, self.num)
class Course(models.Model):
    name=models.CharField('课程',max_length=20)
    students=models.ManyToManyField('Student_User',through='Enroll')
    def __str__(self):
        return self.name
class Enroll(models.Model):
    student=models.ForeignKey('Student_User',on_delete=models.CASCADE)
    course =models.ForeignKey('Course',on_delete=models.CASCADE)
    pay = models.FloatField('缴费金额',default=0)
    c_time = models.DateTimeField('报名时间',auto_now_add=True)

猜你喜欢

转载自www.cnblogs.com/zy0307/p/10540078.html