网页制作之Django-数据库操作

学习目标:

学会使用Django自带数据库的各种增删改查操作,实现基本功能。

学习内容:

1、 数据库基础知识
select * from tb where id>1
# 对应关系
models.tb.objects.filter(id_gt=1)
models.tb.objects.filter(id=1)
models.tb.objects.filter(id_gt=1)

2、 创建表单的一般流程

a.  创建类
    from django.db import models
    # 表名:amdb_userinfo
    class UserInfo(models.Model):
        # id列,自增,主键
        # 用户名列,字符串类型,指定长度
        username = models.CharField(max_length=32)
        password = models.CharField(max_length=64)
b.  设置添加app
    settings.py
        INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'amdb',
        ]
c.  运行创建表单
    python manage.py makemigrations
    python manage.py migrate
d.  ==========注意============
    Django默认使用MySQLdb模块链接MySQL
    主动修改为pymysql,在project同名文件夹下的__init__.py文件中添加如下代码即可:
        import pymysql
        pymysql.install_as_MySQLdb()

3、 根据类自动创建数据库表

	# app下的model.py
    python manage.py makemigrations
    python manage.py migrate

    # 字段类型:字符串    数字  时间  二进制 自增Auto(primary_key=True)

    # 字段参数:
        null                            -->db是否可以为空
        default                         -->默认值
        primary_key                     -->主键
        db_column                       -->列名
        db_index                        -->索引
        unique                          -->唯一索引
        unique_for_date                 -->
        unique_for_month                -->
        unique_for_year                 -->
        auto_now_time                   -->创建时,自动生成时间
        auto_now                        -->更新时,自动更新为当前时间
            # 不支持这种方式
            # obj = UserGroup.objects.filter(id=1).update(Title='CEO')
            # 支持下面这种更新方式
            # obj = UserGroup.objects.filter(id=1).first()
            # obj.Title = 'CEO'
            # obj.save()
        choices                         -->Django admin中显示下拉框,避免连表查询
        blank                           -->Django admin中是否可以为空
        verbose_name                    -->Django admin中显示字段中文
        editable                        -->Django admin中是否可以被编辑
        error_message                   -->Django admin中错误信息
        help_text                       -->Django admin中的提示
        validators                      -->Django admin中的自定义错误信息

4、 根据类对数据库表中的数据进行各种操作

一对多
    a.  外键
    b.  外键字段_id
    c.  models.tb.object.create(name="root",user_group_id=1)
    d.
        user_list = models.db.object.all()
        for row in user_list:
            row.id
            row.user_group_id
            row.user_group_Title
多对多
   方式一:自定义关系表
       class Host(models.Model):
           nid = models.AutoField(primary_key=True)
           hostname = models.CharField(max_length=32, db_index=True)
           ip = models.GenericIPAddressField(protocol='ipv4', db_index=True)
           port = models.IntegerField()
           b = models.ForeignKey(to='Business', on_delete=models.CASCADE, to_field='id', default=1)
       # 10
       class Application(models.Model):
           name = models.CharField(max_length=32)
       # 2
       class HostToApp(models.Model):
           hobj = models.ForeignKey(to="Host", on_delete=models.CASCADE, to_field="nid")
           aobj = models.ForeignKey(to="Application", to_field="nid", on_delete=models.CASCADE)
           status = models.CharField(max_length=32)
   方式二:自动创建关系表
       class Host(models.Model):
           nid = models.AutoField(primary_key=True)
           hostname = models.CharField(max_length=32, db_index=True)
           ip = models.GenericIPAddressField(protocol='ipv4', db_index=True)
           port = models.IntegerField()
           b = models.ForeignKey(to='Business', on_delete=models.CASCADE, to_field='id', default=1)
       # 10
       class Application(models.Model):
           name = models.CharField(max_length=32)
           r = models.ManyToManyField("Host")

       无法直接对第三张表进行操作
       obj = Application.objects.get(id=1)
       obj.name

       # 第三张表操作
           添加对应关系
               obj.r.add(1)
               obj.r.add(2,3,4)
               obj.r.add(*[1,2,3,4])
           删除对应关系
               obj.r.remove(1)
               obj.r.remove(2,3,4)
               obj.r.remove(*[1,2,3,4])
           清除id为1的对象
               obj.r.clear()
           更新,清除原有对应关系
               obj.r.set([3,5,7])
           获取所有相关主机对象(列表)(queryset)
               obj.r.all()

5、查找数据库中数据的方法

v1 = models.Business.objects.all()
# QuerySet
# [obj(id,caption,code),obj(id,caption,code),obj(id,caption,code)]

v2 = models.Business.objects.all().values('id','caption')
# QuerySet
# [{'id':1,'caption':'HHH'},]

v3 = models.Business.objects.all().values_list('id', 'caption')
# QuerySet
# [(1, 'HHH'),]

# nid__gt=0表示选取所有nid大于0的数据
v1 = models.Host.objects.all()

# filter和values中的跨表查询要用__代替.
v2 = models.Host.objects.all().values('nid','hostname','b_id','b__caption')

v3 = models.Host.objects.all().values_list('nid', 'hostname', 'b_id', 'b__caption')

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值