Django模型
2018-09-17 本文已影响0人
铅笔与旧友
一、Objects管理器
自定义object管理器
class Studentmanager(modles.Manger):
# 重写all()
def all(self):
#获取所有数据 super().all()
#逻辑删除的数据,不显示
return super().all().filter(isdel=Flase)
class Student(models.Model):
#系统(默认会自动创建)
#objects = models.Model()
#自定义管理器2
myObjects = Studentmanager()
name = models.CharField(max_length=50)
二、模型类
添加类方法【快速创建模型对象】
@classmethod
def create(cls, name, age, sex):
stu = cls(s_name=name, s_age=age,s_sex=sex)
return stu
添加对象方法【快速创建模型对象】
def create(self,name,score)
stu = self.model()
stu.name = name
stu.score = score
return stu
三、 模型对应关系
- 关系:一对一(OneToOneField)
#关联(约束)
#通过外键实现,在外键中添加唯一约束(保证一对一)
# 主表(重要信息),从表(声明关系)
# 人 class Person(models.Model):
p_name = models.CharField(max_length=30) p_age = models.IntegerField(default=1)
# 身份证
class IDCard(models.Model):
i_num = models.CharField(max_length=36)
i_sex = models.BooleanField(default=False)
# 一对一 [oneToOne,对应的是唯一的]
i_person = models.OneToOneField(Person, default=1)
备注:
默认模式:models.CASECADE:删除级联数据
保护模式:models.PROTECT:级联数据存在,抛出异常;级联数据不存在,直接删除;
置空模式:model.SET_NULL 置空模式[该字段必须设置,允许为空]
默认值模式:model.SET_DEFAULT
(默认情况)删除人,关联的身份证会被自动删除;
删除身份证,人不受影响的;
身份证关联到人,身份证是主动方,即卡跟随于人的;
主表(Person),从表(IDCard) [声明关系的表都是属于从表]
- 数据获取
- 从获取主,关系字段是直接声明的,它是一个显性属性
id_cart = IDCart.objects.last()
person = id_cart.i_person # 身份证对应的人
- 主获取从,关系字段是隐性属性,访问方式(小写): 对象.关联模型
person = Person.objects.last()
idcart = person.idcart # 人对应的身份证,关系模型名IDCard,但要写成小写!!!
- 关系一对多
模型类的定义
# 人
class Person(models.Model):
p_name = models.CharField(max_length=30)
p_age = models.IntegerField(default=1)
# 爱好
class Hobby(models.Model):
h_name = models.CharField(max_length=30)
h_cost = models.FloatField(default=1000)
# 一对多
h_person = models.ForeignKey(Person, on_delete=models.PROTECT)
备注: 默认情况,删除人的时,对应的爱好都会被删除;
可以设置保护模式,或者设置默认值模式;
- 级联数据的获取
- 从获取主,显性属性,直接获取
hobby = Hobby.objects.last()
person = hobby.h_person # 爱好对应的人
- 主获取从,隐性属性,访问方式: 对象.关联模型_set [与objects同源,所以用法也是一致]
person = Person.objects.last()
# hobby_set与objects同源,all表示所有数据
hobbies = person.hobby_set.all() # 人对应的爱好
# 按条件获取
hobbies = person.hobby_set.filter(id=2)
- 关系多对多
模型类的定义
# 用户
class User(models.Model):
u_name = models.CharField(max_length=100) # 名字
u_level = models.IntegerField(default=1) # 等级
# 商品
class Goods(models.Model):
g_name = models.CharField(max_length=100) # 名字
g_price = models.FloatField(default=1) # 价格
# 声明关系
g_user = models.ManyToManyField(User)
备注:
删除数据时,会删除自己表对应的数据和关系中的数据;
- 级联数据的获取
- 从获取主,显性属性,直接获取 [与objects同源,所以用法也是一致]
goods = Goods.objects.last()
# g_user是显性属
user = goods.g_user.all()
- 主获取从,隐性属性,访问方式: 对象.关联模型_set [与objects同源,所以用法也是一致]
user = User.objects.last()
goodslist = user.goods_set.all()
四、模型的继承
- 父类抽象化
父类不会生成表单
子类会将对应的字段 到 子表中
class Meta:
abstract = True
class Animal(models.Model):
a_name = models.CharField(max_length=20)
a_color = models.CharField(max_length=20)
class Meta: # 抽象化
abstract = True
class Dog(Animal):
d_bark = models.CharField(max_length=20)
class Cat(Animal):
c_eat = models.CharField(max_length=20)
- 问题:模型或表有问题时
- 删除数据库
- 删除迁移目录
- 创建数据库
- 执行生成迁移文件以及目录
python manage.py makemigrations 应用名
- 执行迁移
python manage.py migrate