Django: ORM must be checked

1.ORM common field

  • In models.py, create a field in a table

1.1AutoField

  • From the growing field of plastic surgery, a required parameter primary_key = True, then the primary key of the database. Without this field, django automatically created. A model can not have two AutoField field.

    from django.db import models
    class Person(models.Model):
      pid = models.AutoField(primary_key=True)

1.2 IntegerField

  • An integer type. The range of values ​​is -2147483648 to 2147483647.

     class Person(models.Model):
      age = models.IntegerField()

1.3 CharField

  • Character type, you must provide max_length parameters. max_length represent characters in length.

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

1.4 DateField

  • Date type, date format YYYY-MM-DD, corresponding to the examples in Python datetime.date.

  • parameter:

    • auto_now: each modification to the current date and time when the modification.
    • auto_now_add: automatically add the current date and time when a new object is created.
    • Note: between default auto_now_add auto_now are mutually exclusive, only fill a
    class Person(models.Model):
      birth = models.DateField(auto_now_add=True)

1.5 DatetimeField

  • Date time field, in the format YYYY-MM-DD HH: MM [: ss [.uuuuuu]] [TZ], corresponding to the examples in Python datetime.datetime.

    class Person(models.Model):
      birth = models.DateTimeField(auto_now_add=True)

1.6 BooleanField

  • Boolean value

    class Person(models.Model):
      gender = models.BooleanField("性别",choices=((0,"男"),(1,"女")))

1.7 DecimalField

  • Decimal fractions

  • parameter:

    • Total length max_digits
    • decimal_places decimal places
    class Person(models.Model):
      money = models.DecimalField(max_digits =5,decimal_places=3)

1.8 TextField

  • Text Types

1.9 Learn to:

1.BigAutoField
    bigint自增列,必须填入参数 primary_key = True
2。SmallIntegerField(IntegerField)
    小整数 -32768 ~ 32767
3.PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
    正小整数 0 ~ 32767
4.IntegerField(Field)
    整数列(有符号的) -2147483648 ~ 2147483647
5.PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
    正整数 0 ~ 2147483647
6.BigIntegerField(IntegerField)
    长整型(有符号的) -9223372036854775808 ~ 9223372036854775807
7.NullBooleanField(Field)
    可以为空的布尔值
8.EmailField(CharField)
    字符串类型,Django Admin以及ModelForm中提供验证机制
9.IPAddressField(Field)
    字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制
10.GenericIPAddressField(Field)
    字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6
    参数:
         protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
         unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启此功能,需要protocol="both"
         
11.URLField(CharField)
    字符串类型,Django Admin以及ModelForm中提供验证 URL
12.SlugField(CharField)
    字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号)
13.CommaSeparatedIntegerField(CharField)
    
14.UUIDField(Field)
     字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证

15.FilePathField(Field)
    字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能
    参数:
        path,                      文件夹路径
        match=None,                正则匹配
        recursive=False,           递归下面的文件夹
        allow_files=True,          允许文件
        allow_folders=False,       允许文件夹

16.FileField(Field)
     字符串,路径保存在数据库,文件上传到指定目录
     参数:
            upload_to = ""      上传文件的保存路径
            storage = None      存储组件,默认django.core.files.storage.FileSystemStorage

17.ImageField(FileField)
      字符串,路径保存在数据库,文件上传到指定目录
      参数:
            upload_to = ""      上传文件的保存路径
            storage = None      存储组件,默认django.core.files.storage.FileSystemStorage
            width_field=None,   上传图片的高度保存的数据库字段名(字符串)
            height_field=None   上传图片的宽度保存的数据库字段名(字符串)


18.TimeField(DateTimeCheckMixin, Field)
     时间格式      HH:MM[:ss[.uuuuuu]]

19.DurationField(Field)
     长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型

20.FloatField(Field)
     浮点型

21.DecimalField(Field)
     10进制小数
     参数:
        max_digits,小数总长度
        decimal_places,小数位长度

22.BinaryField(Field)
      二进制类型

Note : When the model, if there is no auto-increment, then automatically return to create a column called id column

2. Custom Fields

  • Char a custom field type models.py
class MyCharField(models.Field):
    def __init__(self,max_length,*args,**kwargs):
        self.max_length = max_length
        super(MyCharField,self).__init__(max_length=max_length,*args,**kwargs)
    def db_type(self,connection):
        return "char(%s)"%(self.max_length)
  • Use custom fields:
class Person(models.Model):
    iphone = MyCharField(max_length=11)

Registration 3.Django activation in a superuser and tables

  • In the Terminal enter the command python3 manage.py createsuperuser

  • Table registration: Enter the file admin.py

    from django.contrib import admin
    from app01 import models
    
    admin.site.register(models.Person)

4. Set the parameter field

  • Common field parameters
null            数据库中字段是否可以为空
db_column        数据库中字段的列名
default          数据库中字段的默认值
primary_key       数据库中字段是否为主键
db_index          数据库中字段是否可以建立索引
unique            数据库中字段是否可以建立唯一索引
verbose_name        Admin中显示的字段名称
blank               Admin中是否允许用户输入为空
editable            Admin中是否可以编辑
help_text           Admin中该字段的提示信息
choices             Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
index_together     联合索引
unique_together    联合唯一索引
  • null and blank

    class Person(models.Model):
      iphone = MyCharField(max_length=11,null=True)  #表示数据库可以为null,默认null为False
    #设置改变数据库属性必须执行数据库迁移命令如null,改变Django内form表单可以不用执行数据库命令,如blank
    # 一般blank和null同时出现。blank=True  from表单填写时为可以为空
  • db_column

    class Person(models.Model):
      name = models.CharField(max_length=32,db_column="username")
    #django字段显示name,在数据库中显示为username
  • default

    class Person(models.Model):
      age = models.IntegerField(default=18)
    #需要注意:default auto_now_add auto_now 之间是互斥的,只能填写一个
  • verbose_name/db_table/verbose_name_plural

    class Meta:
        db_table = "个人管理"
        verbose_name = "个人信息表"
        verbose_name_plural = "哈哈"
    #verbose_name也可以给字段设置admin显示的内容
    age = models.IntegerField(default=18, verbose_name='年纪', editable=True)

    verbose_name_plural:

    verbose_name:

​ db_table:

  • editable

    #当给age设置editable为Fasle,则admin页面将不会显示age
    class Person(models.Model):
      age = models.IntegerField(default=18, verbose_name='年纪', editable=False)
  • help_text help information

    class Person(models.Model):
      age = models.IntegerField(default=18, verbose_name='年纪',help_text="不是农历岁数")
    

    Show in admin:

  • choices

    class Person(models.Model):
      gender = models.BooleanField("性别",choices=((0,"男"),(1,"女")))

    display effect:

  • class Meta common parameters

    model = models.Student   #对应的Model中的类
    fields = "__all__" #字段,如果是__all__,就是表示列出所有的字段
    exclude = None #排除的字段
    labels = None #提示信息
    help_texts = None #帮助提示信息
    widgets = None  #自定义插件
    error_message = None #自定义错误信息

5.Model Meta parameter settings

  • Not often used, if there are special needs can use
class Person(models.Model):
    ......
    class Meta:
        db_table = "个人管理"
        verbose_name = "个人信息表"
        verbose_name_plural = "哈哈"
        #联合索引
        index_together=[
            ("name","age"),
        ]
        #联合唯一索引
        unique_together = (("iphone","birth"),)
        

6. Create data in interactive mode

  • pycharm built-in interactive mode start Django, you can execute code.
增:
obj = models.Person.objects.create(name="xjk",iphone="13589306703",gender=0)
删:
obj.delete()
改:
obj.update(name="xujunkai")
查:
obj = models.Person.objects.filter(pk=5)

7.ORM must know the query (13)

  • Under the project directory create folders
  • Then create py file in the folder
  • Import module (re-configure the environment django.setup ())

#必须按照这个顺序,否则报错
import os
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE","mro_lianxi.settings")#mro_lianxi为项目名称
django.setup()
from app01 import models
django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but settings are not configured

django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
  • Inquire
#all()   获取所有的数据    --->QuerySet 对象列表
ret = models.Person.objects.all()
print(ret)

#get()  获取满足条件的一个数据 ---->对象(获取不到或者多个报错)
ret = models.Person.objects.get(pk=1)
print(ret)

#filter()  获取满足条件所有数据 ---> QuerySet 对象列表
ret = models.Person.objects.filter(pk=1)
print(ret)

#exclude()  获取不满足条件的所有数据 ---> QuerySet  对象列表
ret = models.Person.objects.exclude(pk=1)
print(ret)

#values()    获取对象所有的字段和字段的值     QuerySet[{},{}]
#values(字段)    获取对象指定的字段和字段值    QuerySet[{},{}]
ret = models.Person.objects.values()
print(ret)
ret = models.Person.objects.values("pid","name")
print(ret)

# values_list()  拿到对象所有的字段值  QuerySet[(),()]
ret = models.Person.objects.values()
print(ret)

# order_by 排序  '-'号代表降序  ----> QuerySet[(),()]
ret = models.Person.objects.order_by("age","-pid")#按照age升序,pid降序
print(ret)

#reverse 反向排序  只对已经排序的QuerySet进行反转
ret = models.Person.objects.all().order_by("pk").reverse()
print(ret)

#distinct 去重    完全相同才能去重... 拿到values 是一个QuerySet对象,里面装字典键age, 给age相同去重
ret = models.Person.objects.values("age").distinct()
print(ret)

#count 计数
ret = models.Person.objects.all().count()
print(ret)

#first 取第一个元素  没有元素 None
ret = models.Person.objects.all().values().first()
print(ret)

#last 取最后一个元素  没有元素None
ret = models.Person.objects.all().values().last()
print(ret)

# exists 查询数据是否存在
ret = models.Person.objects.filter(pk=10000).exists()
print(ret)

Note :

class Meta:
     ordering = ("pk") #默认排序 此处有坑
#不要再Meta设置排序,这样会导致后面使用其他方法查表,查询无效
#如:
    distinct  去重   失效
  • summary:
1.返回QuerySet
    all()    
    filter()
    exclude()
    values()  
    values_list() 
    order_by() 
    reverse() 
    distinct()
2.返回一个对象
    get() 
    first()
    last()
3.返回数字
    count()
4.返回布尔值
    exists()

8. The single-table queries of magical double underline

#gt
# 大于(greater than)
#获取pk大于1。
ret = models.Person.objects.filter(pk__gt=1)
print(ret)

#lt
#小于(less than)
#获取pk小于3
ret = models.Person.objects.filter(pk__lt=3)
print(ret)

#gte
#大于等于(greater than  equal)
#获取pk大于等于2
ret = models.Person.objects.filter(pk__gte=2)
print(ret)

#lte
#小于等于(less than  equal)
#获取pk 小于等于3
ret = models.Person.objects.filter(pk__lte=3)
print(ret)

#range
#范围
#获取pk 在2~4之间的对象
ret = models.Person.objects.filter(pk__range=[2,4])
print(ret)

#in
#成员判断
#获取pk 在[1,2,5,10]里的
ret = models.Person.objects.filter(pk__in=[1,2,5,10])
print(ret)

#contains
#获取name有a的对象
ret = models.Person.objects.filter(name__contains="a")
print(ret)

#icontains
#获取name有a的,不区分大小写
ret = models.Person.objects.filter(name__icontains="a")
print(ret)

#startswith
#获取name以a开头的
ret = models.Person.objects.filter(name__startswith='a')  # 以什么开头
print(ret)

#istartswith
#获取name以a开头的,不区分大小写
ret = models.Person.objects.filter(name__istartswith='a')
print(ret)

#endswith
#获取name以a结尾的对象
ret = models.Person.objects.filter(name__endswith='a')  # 以什么结尾
print(ret)

#iendswith
#获取name 以a结尾的对象,不区分大小写
ret = models.Person.objects.filter(name__iendswith='a')
print(ret)

#year
#获取birth里的year 为2019的对象
ret  = models.Person.objects.filter(birth__year='2019')
print(ret)

#contains
#获取birth年月日为2017-06-24的对象
#会有warning警告
ret  = models.Person.objects.filter(birth__contains='2017-06-24')
print(ret)

#isnull
#获取iphone 为是null的对象
ret  = models.Person.objects.filter(iphone__isnull=True)
print(ret)

9. A foreign key operation

  • First, create two foreign key table
  • Code:
#models.py
class Publisher(models.Model):
    name = models.CharField(max_length=32)
    def __str__(self):
        return self.name
class Book(models.Model):
    title = models.CharField(max_length=32)
    pub = models.ForeignKey(Publisher,on_delete=models.CASCADE)
    def __str__(self):
        return self.title

  • Py file created in orm_test, and import the module

    import os
    import django
    
    os.environ.setdefault("DJANGO_SETTINGS_MODULE","mro_lianxi.settings")
    django.setup()
    
    from app01 import models
  • Object-based query

    #正向查找(Book有关联的外键,先查询有外键关联的)
    #通过查书的名字,从而查到出版社
    book_obj = models.Book.objects.get(title="Go基础")
    print(book_obj.pub)
    #图灵出版社
    
    #反向查询 (类名小写_set)
    #通过查询出版社--->来查询到出版的书
    pub_obj = models.Publisher.objects.get(pk=2)
    print(pub_obj.book_set.all())
    
    
    
  • related_name use

    #models.py
    class Publisher(models.Model):
        name = models.CharField(max_length=32)
        def __str__(self):
            return self.name
    class Book(models.Model):
        title = models.CharField(max_length=32)
        pub = models.ForeignKey(Publisher,related_name='books',on_delete=models.CASCADE)
        def __str__(self):
            return self.title
    #当把Book的pub字段设置related_name='books',则反向查找方式更改为
    pub_obj = models.Publisher.objects.get(pk=2)
    print(pub_obj.books.all())
  • Based on the query field

    #查询title为Go基础的对象
    ret = models.Book.objects.filter(title="Go基础")
    print(ret)
    #查询图灵出版社出版的书
    ret = models.Book.objects.filter(pub__name="图灵出版社")
    print(ret)
    
    #当related_name = "books"
    #反向查找:
    ret= models.Publisher.objects.filter(books__title='Go基础')
    print(ret)
    
    
    #当设置related_query_name="mybook" 和related_name = "books"
    
    ret= models.Publisher.objects.filter(mybook__title='Go基础')
    print(ret)

Exercises: https://www.cnblogs.com/maple-shaw/articles/9414626.html

Guess you like

Origin www.cnblogs.com/xujunkai/p/11847447.html