zoukankan      html  css  js  c++  java
  • Django之数据库连表操作

    1、表结构修改

    如果原来表中已存在的数据,表结构修改后就会出现结构混乱,makemigrations更新表的时候就会出错,解决方法:

    1、新增加的字段,设置允许为空。生成表的时候,之前数据新增加的字段就会为空。(null=True允许数据库中为空,blank=True允许admin后台中为空)
    2、新增加的字段,设置一个默认值。生成表的时候,之前的数据新增加字段就会应用这个默认值

    图片、IP字段

    ip = models.GenericIPAddressField(protocol="ipv4",null=True,blank=True)
    img = models.ImageField(null=True,blank=True,upload_to="upload")
    

    settings文件配置url映射

    数据中只是报错路径信息

    2、常用参数 

    选择下拉框  choices

    class UserInfo(models.Model):
        USER_TYPE_LIST = ((1,'user'),(2,'admin'),)
        user_type = models.IntegerField(choices=USER_TYPE_LIST,default=1)
    

     

    3、连表结构

    • 一对多:models.ForeignKey(其他表)
    • 多对多:models.ManyToManyField(其他表)
    • 一对一:models.OneToOneField(其他表)
    应用场景:
    一对多:当一张表中创建一行数据时,有一个单选的下拉框(可以被重复选择)
    例如:创建用户信息时候,需要选择一个用户类型【普通用户】【金牌用户】【铂金用户】等。
    多对多:在某表中创建一行数据是,有一个可以多选的下拉框
    例如:创建用户信息,需要为用户指定多个爱好
    一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了
    例如:原有含10列数据的一张表保存相关信息,经过一段时间之后,10列无法满足需求,需要为原来的表再添加5列数据
    

     一对多情况:

    class Groupname(models.Model):
        caption = models.CharField(max_length=30)  #不同的职务字段
    
    class User(models.Model):
        username = models.CharField(max_length=30)
        password = models.CharField(null=False,max_length=30)
        email = models.EmailField(null=False)
        groupname = models.ForeignKey(Groupname)  #外键
    

    User表会自动添加groupname_id 的一个字段

     多对多情况:

    class UserGroup(models.Model):
        group_name = models.CharField(max_length=16)
     
    class User(models.Model):
        name = models.CharField(max_length=16)
        sex = models.CharField(max_length=16)
        email = models.EmailField(max_length=32)
        usergroup_user = models.ManyToManyField('UserGroup')
    

     Django model会自动创建第3张关系表,用于对应user id 和usergroup id

    一对一情况:

    class User2(models.Model):
        name = models.CharField(max_length=16)
        sex = models.CharField(max_length=16)
        email = models.EmailField(max_length=32)
     
    class Admin(models.Model):
        username = models.CharField(max_length=32)
        password = models.CharField(max_length=32)
        admin_user2 = models.OneToOneField('User2')
    

     

    获取GET参数数据,GET方式查询:

    class Group2(models.Model):
        caption = models.CharField(max_length=32)
     
    class User2(models.Model):
        username = models.CharField(max_length=32)
        group2 = models.ForeignKey('Group2')
    

    一对多跨表操作,总结
    1、group2对应的是一个对象
    2、创建数据 group2_id ,直接查询数据库
    3、获取数据,通过.     group2.caption
    4、查询数据,通过__   group2__caption

     

  • 相关阅读:
    软工实践个人总结
    第05组 每周小结 (3/3)
    第05组 每周小结 (2/3)
    第05组 每周小结 (1/3)
    第05组 Beta冲刺 总结
    第05组 Beta冲刺 (5/5)
    第05组 Beta冲刺 (4/5)
    第六次作业
    第05组 Beta冲刺 (3/5)
    第05组 Beta冲刺 (2/5)
  • 原文地址:https://www.cnblogs.com/honey-badger/p/8605850.html
Copyright © 2011-2022 走看看