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

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

 

posted @ 2018-06-22 20:41  谎~言  阅读(150)  评论(0编辑  收藏  举报