Django模型

一、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

你可能感兴趣的:(Django模型)