• Django数据库增删改查


    添加
    # 表.objects.create
    
    # 方法一
    a = User.objects.create(userNum=123, name='ABB', age=18, sex='男')
    
    # 方法二
    d = dict(userNum=123, name='ABB', age=18, sex='男')
    a = User.objects.create(**d)
    
    #方法三
    a = User(userNum=123, name='ABB', age=18, sex='男')
    a.save()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    参数解释
    get_or_create只要有一个字段值与数据表中不相同(除主键),就会执行插入操作
    如果完全相同则不进行插入操作,而是返回这行数据的数据对象
    update_or_create判断当前数据在数据表中是否存在,若存在则进行更新,否则为新增表数据
    bulk_create对数据进行批量操作
    v1 = User(userNum=123, name=‘ABB’, age=18, sex=‘男’)
    v2 = User(userNum=124, name=‘ABC’, age=19, sex=‘女’)
    info_list = [v1,v2]
    User.objects.bulk_create(info_list)
    删除
    # 表.objects.filter().delete()
    
    # 方法一 删除全部内容
    User.objects.all().delete()
    
    #方法二 删除一条name为ABC的数据
    User.objects.filter(name='ABC').delete()
    
    #方法三 删除多条数据
    User.objects.filter(age=18).delete()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    删除过程中数据设有外键字段,就会同时删除外键关联的数据,删除模式参考models.py中设置的PROTECT、SET_NULL等

    修改
    # 表.objects.filter().update()
    
    # 方法一 修改name为ABC的性别为gay
    User.objects.filter(name='ABC').update(sex='gay')
    
    # 方法二 
    a = dict(age='1')
    User.objects.filter(name='ABC').update(**a)
    
    # 方法三 使用F方法实现自增/自减
    from djanto.db.models import F
    User.objects.filter(name='ABC').update(age=F('age')+1)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    查询
    # select * from user 全表查询
    a = User.objects.all()
    # 查第一条
    a[0].name
    
    # select * from user LIMIT3 查前3条
    a = User.objects.all()[:3]
    
    # filter 也可添加多个条件
    User.objects.filter(name='ABC',age=18)
    
    # SQL中or方法 select * from user where name='ABC' or age=18 ,需要引入 Q
    from django.db.models import Q
    User.objects.filter(Q(name='ABC') | Q(age=18))
    
    # SQL中not方法 select * from user where not name='ABC' ,在Q前加~
    User.objects.filter(~Q(name='ABC'))
    
    # 统计数量
    User.objects.filter(name='ABC').count()
    
    # 去重 select DISTINCT name from user where name='ABC' ,distinct无需设置参数,去重方式根据values
    a = User.objects.values('name').filter(name='ABC').distinct()
    
    # 降序排序查询,降序在order_by里设置 '-'
    User.objects.order_by('-age')
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    匹配符使用说明
    __exactfilter(name__exact=‘ABC’)完全等于
    __iexactfilter(name__iexact =‘ABC’)完全等于并忽略大小写
    __containsfilter(name__contains =‘ABC’)模糊匹配,类似SQL中like %ABC%
    __icontainsfilter(name__icontains =‘ABC’)模糊匹配并忽略大小写
    __gtfilter(name__gt =1)大于
    __gtefilter(name__gte =1)大于等于
    __ltfilter(name__lt=1)小于
    __ltefilter(name__lte=1)小于等于
    __isnullfilter(name__isnull=True/False)判断是否为空
    关联表外键参数on_delete
    (1)、on_delete = None:
    删除关联表的数据时,当前表与关联表的filed的行为。
    (2)、on_delete = models.CASCADE:
    表示级联删除,当关联表(子表)中的数据删除时,与其相对应的外键(父表)中的数据也删除。
    (3)、on_delete = models.DO_NOTHING:
    你删你的,父亲(外键)不想管你
    (4)、on_delete = models.PROTECT:
    保护模式,如采用这个方法,在删除关联数据时会抛出ProtectError错误
    (5)、on_delete = models.SET_DEFAULT:
    设置默认值,删除子表字段时,外键字段设置为默认值,所以定义外键的时候注意加上一个默认值。
    (6)、on_delete = models.SET(值):
    删除关联数据时,自定义一个值,该值只能是对应指定的实体
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    数据库字段
    • 字符串

      password=models.CharField(verbose_name='密码:',max_length=50)
      
      • 1
    • 设置主键

      account=models.CharField(verbose_name='账号:',max_length=50,primary_key=True,db_index=True)
      db_index:添加索引
      
      • 1
      • 2
    • 设置关联外键

      account=models.ForeignKey(User_Account,on_delete = models.CASCADE)
      
      • 1
    • 整型

      group_id=models.IntegerField(verbose_name='群聊编号')
      
      • 1
    • 布尔类型

      models.BooleanField(verbose_name='是否可以增加文件',default=False)
      
      • 1
    • 单选

      #sex choices 设置单选,元组前面的值为真是存储值,后面的值为展示值sex=models.CharField(max_length=1,choices=[('男','男'),('女','女')])
      
      • 1
    • 时间

      DateTimeField(DateField)x
      日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]
      
      models.DateField(verbose_name='token更新时间',auto_now=True)
      日期格式 YYYY-MM-DD
      auto_now:每次修改都会自动更新
      auto_now_add:数据创建时值为添加时的时间,后续其他字段数据修改不会变
      
      TimeField(DateTimeCheckMixin, Field)
      时间格式 HH:MM[:ss[.uuuuuu]]
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
    清空数据库,重新建表
    • 想要删除自己之前练习的数据库模型

      Order.objects.all().values().delete()
      
      • 1
    • 删除文件

      • 删除数据库内所有的表
      • 删除migrations文件夹中的所有 文件,除了__init__.py 文件
      • 运行
      python manage.py makemigrations
      python manage.py migrate
      
      • 1
      • 2
    django 解决manage.py migrate无效的问题
    • 解决方案

      python manage.py dbshell 进到数据库中,执行delete from django_migrations where app='your_appname';
      
      python manage.py makemigrations(若migrations文件未删除,可不执行这一步)
      
      python manage.py migrate 好啦,大功告成
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • 原因

      造成多次应用migrations失败的原因是,当前model是修改过的,原来的migrations已经被我删除,但是,重新生成的migrations使用递增整数记名,所以,在django_migrations表中0001,0002等前面几个数字的文件都已被记录,在Django看来,被记录了就相当于已应用,所以,会出现刚开始的No migrations to apply.
      
      • 1
  • 相关阅读:
    Python连接Neo4j工具比较 Neo4j Driver、py2neo
    k8s详细安装过程
    [手撕源码]ArrayList与顺序表分析
    FPGA图像采集与显示项目(一)带LOGO的VGA显示模块
    日本MF备案注册数据库-在线免费查询
    input禁止输入
    TDengine 入门教程⑧——数据库管理工具 | DBeaver 连接 TDengine
    使用Docker创建并运行一个create-react-app应用(超简单)
    Android RecyclerView 两种以上ViewHolder显示错乱
    华为FreeBuds Pro 2戴久了耳朵会痛,缓解小tips~
  • 原文地址:https://blog.csdn.net/s_frozen/article/details/125869162