Django Orm 常用字段和参数

Posted yftzw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

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

技术分享图片

 




以上是关于Django Orm 常用字段和参数的主要内容,如果未能解决你的问题,请参考以下文章

Django框架 Django之ORM常用字段和参数

Django—ORM常用字段和参数

[Django框架之ORM常用字段和参数单表操作]

Django中ORM常用字段及字段参数

Django ORM 常用字段和参数

python3开发进阶-Django框架的ORM常用字段和参数