美文网首页
Django模型

Django模型

作者: 铅笔与旧友 | 来源:发表于2018-09-17 21:06 被阅读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
    

    相关文章

      网友评论

          本文标题:Django模型

          本文链接:https://www.haomeiwen.com/subject/eibdnftx.html