zoukankan      html  css  js  c++  java
  • Django Orm 常用字段和参数

    ORM 对象关系映射

    Django中的orm

    第一步:先在Django项目的settings.py文件中,配置数据库连接信息

    DATABASES = {
        "default": {
            "ENGINE": "django.db.backends.mysql",
            "NAME": "你的数据库名称",  # 需要自己手动创建数据库
            "USER": "数据库用户名",
            "PASSWORD": "数据库密码",
            "HOST": "数据库IP",
            "POST": 3306
        }
    }

    第二步:在Django项目的__init__.py文件中写如下代码,告诉Django使用pymysql模块链接的数据库

    import pymysql
    
    pymysql.install_as_MySQLdb()

    model

    说明:

      1.表名是自动生成的,如果要自定义表名:

      

    class Author(models.Model):
        name=models.CharField(max_length=32)
        books=models.ManyToManyField(to='Book',db_table='author2book')#多对多建立关系时生成第三张表自定义表名
        class Meta:
            db_table = 'author'#自定义表名

      2.id字段是自动添加的,如果你想要指定自定义主键,只需在其中一个字段中指定primary_key=True即可。如果Django发现你已经明确地设置了Field.primary_key,它将不会添加自动id列。

      3.Django会根据配置文件中指定的数据库后端类型来生成相应的SQL语句

      4.Django支持MySQL5.5及更高版本

    Django ORM一般操作

    all()查询所有结果

        ret=models.Book.objects.all()
        print(ret)#<QuerySet [<Book: 我是小三>, <Book: 渣男是怎样练成的>, <Book: 番茄的十种做法>]>

    filter(**kwargs)它包含了与所给筛选条件相匹配的对象

        ret=models.Publisher.objects.filter(id=1)
        print(ret)#<QuerySet [<Publisher: 我是垃圾出版社>]>

    get(**kwargs)返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有就会抛出错误

        ret = models.Publisher.objects.get(id=1)
        print(ret)#我是垃圾出版社
        ret = models.Publisher.objects.get(name='我是垃圾出版社')
        print(ret)#app01.models.MultipleObjectsReturned: get() returned more than one Publisher -- it returned 2!

    exclude(**kwargs)它包含了与所给筛选条件不匹配的对象

        ret = models.Publisher.objects.exclude(id=1)
        print(ret)#<QuerySet [<Publisher: 超神出版社>]>

    values(*field)返回一个ValueQuerySet一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列

        ret = models.Publisher.objects.values()
        print(ret)#<QuerySet [{'id': 1, 'name': '我是垃圾出版社', 'city': '上海'}, {'id': 2, 'name': '超神出版社', 'city': '北京'}]>
        print(ret[0])#{'id': 1, 'name': '我是垃圾出版社', 'city': '上海'}
        print(ret[0]['name'])#我是垃圾出版社
        ret1 = models.Publisher.objects.values('id','name')
        print(ret1)#<QuerySet [{'id': 1, 'name': '我是垃圾出版社'}, {'id': 2, 'name': '超神出版社'}]>

    values_list(*field)它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列

        ret = models.Publisher.objects.values_list()
        print(ret)#<QuerySet [(1, '我是垃圾出版社', '上海'), (2, '超神出版社', '北京')]>
        print(ret[0])#(1, '我是垃圾出版社', '上海')
        print(ret[0][1])#我是垃圾出版社
        ret1 =  models.Publisher.objects.values_list('id','name')
        print(ret1)#<QuerySet [(1, '我是垃圾出版社'), (2, '超神出版社')]>

    order_by(*field)对查询结果排序

        from app01 import models
        ret = models.Book.objects.order_by('title')
        print(ret)#<QuerySet [<Book: 我是小三>, <Book: 未成年心理学>, <Book: 渣男是怎样练成的>, <Book: 番茄的十种做法>]>
        ret1 = models.Book.objects.order_by('price')
        print(ret1)#<QuerySet [<Book: 番茄的十种做法>, <Book: 未成年心理学>, <Book: 渣男是怎样练成的>, <Book: 我是小三>]>默认升序

    reverse()对查询结果反向排序,请注意reverse()通常只能在具有已定义顺序的QuerySet上调用(在model类的Meta中指定ordering或调用order_by()方法)

        from app01 import models
        ret = models.Book.objects.order_by('title').reverse()
        print(ret)#<QuerySet [<Book: 番茄的十种做法>, <Book: 渣男是怎样练成的>, <Book: 未成年心理学>, <Book: 我是小三>]>
        ret1 = models.Book.objects.order_by('price').reverse()
        print(ret1)#<QuerySet [<Book: 我是小三>, <Book: 渣男是怎样练成的>, <Book: 未成年心理学>, <Book: 番茄的十种做法>]>

    distinct()去重

        ret4 = models.Book.objects.filter(Q(author__name='西方不败')|Q(author__name='垃圾东瀛')).distinct()
        print(ret4)

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

        from app01 import models
        ret = models.Book.objects.filter(title__icontains='').count()
        print(ret)#2

    first()返回第一条记录

        from app01 import models
        ret = models.Book.objects.first()
        print(ret)#我是小三

    last()返回最后一条记录

        from app01 import models
        ret = models.Book.objects.last()
        print(ret)#未成年心理学

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

        from app01 import models
        ret = models.Author.objects.exists()
        print(ret)#True

    Django ORM 常用字段和参数

    常用字段

    AutoField

    int自增列,必须填入参数primary_key=True。如果没有自增列会自动生成一个id自增列

    from django.db import models
    
    class User(models.Model):
        id=models.AutoField(primary_key=True)
        name=models.CharField(max_length=16)
    
    class Publisher(models.Model):
      #没有自增列 会自动增加id自增列 name
    = models.CharField(max_length=32)

    IntegerField

    一个整数类型,-2147483648 to 2147483647

    因为整数类型只有十位所以手机号 证件号之类的都不可以用它来存

    CharField

    字符类型,必须提供max_length参数,max_length表示字符长度

    class Author(models.Model):
        name = models.CharField(max_length=32)

    字符类型相当于数据库里的varchar类型

    我们可以自定义一个char

    class zhangxiangyucharField(models.Field):
        def __init__(self,max_length,*args,**kwargs):
            self.max_length=max_length
            super().__init__(max_length=max_length,*args,**kwargs)
    
        def db_type(self,connection):
            return 'char(%s)'%self.max_length

    DateField

    日期字段,日期格式 YYYY-MM-DD,相当于python中的datetime.date()实例

    class Book(models.Model):
        title = models.CharField(max_length=32)
        publish_date = models.DateField(auto_now_add=True)
    #auto_now_add添加值的时候时间就固定了,而auto_now每次改变值的时候都会更新一次时间  

    DateTimeField

    日期时间字段,格式YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于python中的datetime.datetime()实例

    字段合集(争取记忆)

    https://www.cnblogs.com/liwenzhou/p/8688919.html

     orm字段和数据库实际字段的对应关系

    字段参数

    null

    用于表示某个字段可以为空

    class Publisher(models.Model):
        name=models.CharField(max_length=32,null=True)

    unique

    如果设置为unique=True 则该字段在此表中必须是唯一的

    class Publisher(models.Model):
        name=models.CharField(max_length=32,unique=True)

    db_index

    如果db_index=True则代表着为此字段设置索引

    defaul

    为该字段设置默认值

    class Publisher(models.Model):
        name=models.CharField(max_length=32,default='张相玉帅哥')

    关系字段

    ForeignKey

    外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在'一对多'中'多'的一方

    ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系

    to

    设置要关联的表

    to_field

    设置要关联的表的字段

    related_name

    反向操作时,使用的字段名,用于代替原反向查询时的'表名_set'。

    related_query_name

    反向查询操作时,使用的连接前缀,用于替换表名

    from django.db import models
    
    # Create your models here.
    
    class Book(models.Model):
        title = models.CharField(max_length=32)
        publish_date = models.DateField(auto_now_add=True)
        price = models.DecimalField(max_digits=5, decimal_places=2)
        # 创建外键,关联publish
        publisher = models.ForeignKey(to="Publisher" ,related_name='books',related_query_name='zhangshuaige')
        # 创建多对多关联author
        author = models.ManyToManyField(to="Author")
    
        def __str__(self):
            return self.title
    import os
    
    if __name__ == '__main__':
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xianzai.settings")
        import django
        django.setup()
        from app01 import models
    
        publisher_obj=models.Publisher.objects.first()
        如果设置了related_name='books'
        ret=publisher_obj.books.all()
        print(ret[0])
    
        #如果设置了 related_query_name='zhangshuaige'
        ret=models.Publisher.objects.filter(id=1).values('zhangshuaige__title')
        print(ret)

    on_delete

    当删除关联表中的数据时,当前表与其关联的行的行为

    OneToOneField

    一对一字段

    通常一对一字段用来扩展已有字段。

    to 设置要关联的表

    to_field 设置要关联的字段

    on_delete

    ManyToManyField

    用于表示多对多的关联关系。在数据库中通过第三张表来建立关联关系

    to related_name  related_query_name 同ForeignKey字段

    through

    设置第三张表的表名

    class Author(models.Model):
        name=models.CharField(max_length=32)
        books=models.ManyToManyField(
            to='Book',
            through='Book2Author',
            through_fields=('author','book')
        )

    through_fields

    设置关联的字段

    db_table

    默认创建第三张表时,数据库中表的名称

  • 相关阅读:
    例题
    经典模型
    定义
    洛谷p2564生日礼物andp2627修建草坪
    转自大佬的线段树
    c++String类
    随机数
    JVM知识点总结
    task5 模型融合 打卡
    task4 建模与调参 打卡
  • 原文地址:https://www.cnblogs.com/yftzw/p/9215410.html
Copyright © 2011-2022 走看看