zoukankan      html  css  js  c++  java
  • Django中的ORM操作练习

    1.准备Django1.11.xx环境->2.在manage.py同级中创建xx.py文件

    2.在创建的xx.py文件中添加以下操作配置Django项目和变量信息

    import os

    if __name__ == '__main__': # 运行当前环境才会执行后面的操作
    # 加载Django项目的配置信息
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
    # 导入Django,并启动Django项目
    import django
    django.setup()
    # 导入创建的APP中的models
    from app01 import models

    3.在settings.py文件的最下面添加以下内容后可查看ORM语句的原生SQL

    LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
    'console': {
    'level': 'DEBUG',
    'class': 'logging.StreamHandler',
    },
    },
    'loggers': {
    'django.db.backends': {
    'handlers': ['console'],
    'propagate': True,
    'level': 'DEBUG',
    },
    }
    }

    4.在model.py文件中建数据表->1.python manage.py makemigrations->2.python manage.py migrate

    class School(models.Model):
    id = models.AutoField(primary_key=True) # 自增的ID主键
    # 创建一个varchar(64)的唯一的不为空的字段
    title = models.CharField(max_length=64, null=False, unique=True)
       def __str__(self):
        # 返回字符串的友好方式
        return self.title


    class Student(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32, null=False, unique=True)
    school = models.ForeignKey(
            to="School", # 创建一对多外键,一个学校可以有多个学生
            on_delete=models.CASCADE, # 删除处理数据时,默认的相关联操作
            related_name="students",      # 指定反向查询的条件代替student_set
            related_query_name="xx",      # 基于双下划线QuerySet对象代替表名
            null=True               # 允许为空
    )    


    class Teacher(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32, null=False, unique=True)
    book = models.ManyToManyField(to="Student") # 创建多对多关联关系,一个老师可以有多个学生,一个学生也可以有多个老师
      
        # ordering  默认排序
    class Meta:
    ordering = ("id",)


    class FixedCharField(models.Field):
    """
    自定义的char类型的字段类
    """
    def __init__(self, max_length, *args, **kwargs):
    self.max_length = max_length
    super(FixedCharField, self).__init__(max_length=max_length, *args, **kwargs)

    def db_type(self, connection):
    """
    限定生成数据库表的字段类型为char,长度为max_length指定的值
    """
    return 'char(%s)' % self.max_length

    5.->ORM常用方法

    1.返回QuerySet对象的方法

    all()                                查询所有结果

    filter()                             包含了与所给筛选条件相匹配的对象,没有或者超出不报错

    exclude()        排除了与所给筛选条件不匹配的对象

    order_by()                      对查询结果排序

    reverse()         查询结果反向排序

    distinct()                         从返回结果中剔除重复纪录

    2.特殊的QuerySet

    values()                          返回一个可迭代的字典序列

    values_list()                    返回一个可迭代的元祖序列

    3.返回具体对象的

    get()                                返回与所给筛选条件相匹配的一个对象,没有或者超出就报错

    first()                               返回第一条记录

    last()                                返回最后一条记录

    4.返回布尔值的方法有:

    exists()                            如果QuerySet包含数据,就返回True,否则返回False

    5.返回数字的方法有

    count()               返回数据库中匹配查询(QuerySet)的对象数量

  • 相关阅读:
    Hapoop 搭建 (五)搭建zookeeper集群环境
    Hapoop 搭建 (四)搭建后测试
    Hapoop 搭建 (二)设置虚拟机SSH无密钥登陆
    Hapoop 搭建 (一)设置虚拟机与主机同一个网段
    windows上vmware 虚拟机,局域网其他主机访问
    Hadoop HDFS命令行操作
    jenkins配置
    WebAPI 实现前后端分离的示例
    Merge join、Hash join、Nested loop join对比分析
    SQL Server nested loop join 效率试验
  • 原文地址:https://www.cnblogs.com/Guishuzhe/p/9524790.html
Copyright © 2011-2022 走看看