Django中M模型基本知识点

一,定义属性
1,在模型中定义的属性,会生成表中的字段
2,定义属性时,需要字段类型,字段类型被定义在django.db.models.fields目录下
3,django会为表增加自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后,则django不会再生成默认的主键列

属性命名限制
不能是python的保留关键字
由于django的查询方式,不允许使用连续的下划线

使用方式
1.  导入from django.db import models
2.  通过models. Field创建字段类型的对象,赋值给属性

二,字段类型
AutoField:一个根据实际ID自动增长的IntegerField,通常不指定,如果不指定,一个主键字段将自动添加到模型中

BooleanField:true/false 字段,此字段的默认表单控制是CheckboxInput
NullBooleanField:支持null、true、false三种值

CharField(max_length=字符长度):字符串,默认的表单样式是 TextInput
TextField:大文本字段,一般超过4000使用,默认的表单控件是Textarea

IntegerField:整数
FloatField:用Python的float实例来表示的浮点数
DecimalField(max_digits=None, decimal_places=None):使用python的Decimal实例表示的十进制浮点数
DecimalField.max_digits:位数总数
DecimalField.decimal_places:小数点后的数字位数

DateField[auto_now=False, auto_now_add=False]):使用Python的datetime.date实例表示的日期
参数DateField.auto_now:每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false
参数DateField.auto_now_add:当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false
该字段默认对应的表单控件是一个TextInput
在管理员站点添加了一个JavaScript写的日历控件,和一个“Today"的快捷按钮
auto_now_add, auto_now, and default 这些设置是相互排斥的,他们之间的任何组合将会发生错误的结果

TimeField:使用Python的datetime.time实例表示的时间,参数同DateField
DateTimeField:使用Python的datetime.datetime实例表示的日期和时间,参数同DateField


FileField:一个上传文件的字段
ImageField:继承了FileField的所有属性和方法,但对上传的对象进行校验,确保它是个有效的image

三,字段选项
通过字段选项,可以实现对字段的约束,在定义字段对象时通过关键字参数指定

verbose_name:在admin界面显示的字段标识
null:如果为True,Django 将空值以NULL 存储到数据库中,默认值是 False
blank:如果为True,则该字段允许为空白,默认值是 False
对比:null是数据库范畴的概念,blank是表单验证证范畴的

db_column:字段的名称,如果未指定,则使用属性的名称
db_index:若值为 True, 则在表中会为此字段创建索引
default:默认值
primary_key:若为 True, 则该字段会成为模型的主键字段
unique:如果为 True, 这个字段在表中必须有唯一值
help_text:会在form表单控件中显示help文本
choices:Admin中选择框的内容
editable            Admin中是否可以编辑


四,元选项

在模型类中定义类Meta,用于设置元信息,对应于数据库中表信息

app_label:指明该模型属于哪一个应用
db_table:定义数据表名称,推荐使用小写字母,数据表的默认名称<app_name>_<model_name>
ordering:对象的默认排序字段,获取对象的列表时使用,接收属性构成的列表
verbose_name:Admin显示模型名
verbose_name_plural:Admin显示模型名附属

五,自定义管理类
class BookManage(models.Manager):
    def setprice(self,book,price):
        if isinstance(book,self.model):
            book.price = price
            book.save()
        else:
            raise Exception(f"{book}并非{self.model}实例")

# Create your models here.
class Book(models.Model):
    title = models.CharField(max_length=20)
    pub_time = models.DateField()
    price = models.DecimalField(max_digits=6,decimal_places=3)
    manage =BookManage()


六,关系
关系的类型包括
ForeignKey:一对多,将字段定义在多的端中
ManyToManyField:多对多,将字段定义在任意一端中
OneToOneField:一对一,将字段定义在任意一端中


1,案例:一对一
在我们自己的项目中需要使用到用户系统,然而django自带了用户系统,并且定义了很多常用字段,此时我们就可以使用一对一关系

from django.contrib.auth.models import User

class MyUser(models.Model):
    telephone = models.CharField(max_length=11)
    user = models.OneToOneField(User,on_delete=models.CASCADE)

此时MyUser与Django自带的User类为一对一关系

通过MyUser找User信息
MyUser.objects.first().user.username
通过User找Myuser
User.objects.first.myuser


2,案例:多对多
class Book(models.Model):
    title = models.CharField(max_length=20)
    pub_time = models.DateField()

from django.contrib.auth.models import User
class MyUser(models.Model):
    telephone = models.CharField(max_length=11)
    user = models.OneToOneField(User,on_delete=models.CASCADE)
    books = models.ManyToManyField("Book")

此时myuser与book即为多对多关系

添加
MyUser.objects.first.books.add( b1,b2,b3 )
删除
MyUser.objects.first.books.remove( b1,b2,b3 )
清空
MyUser.objects.first.books.clear()

用户找书
MyUser.objects.first().books
书找用户
Book.objects.first().myuser_set.all()


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值