常用字段
列1 | 列2 |
---|---|
AutoField() | DecimalField() |
BooleanField() | NullBoolean() |
IntegerField() | FloatField() |
SmallIntegerField() | BigIntegerField() |
PositiveIntegerField() | PositiveSmallIntegerField() |
CharField() | TextField() |
SlugField() | URLField() |
EmailField() | DateField() |
TimeField() | DateTimeField() |
FileField() | FilePathField() |
GenericIPAddressField() | IPAddressField() |
ImageField() | UUIDField() |
1 | 2 | 3 |
---|---|---|
null | blank | choice |
db_column | db_index | db_tablespace |
default | editable | error_message |
help_text | primary_key | unique |
unique_for_date | unique_for_year | unique_for_month |
validators | validator_list | verbose_name |
null
False
, True
表示允许该字段为空True
时,字段为空,则将数据库中该字段置为 NULL
null=True
unique=True
和 blank=True
属性的特例情况下,null=True
需要被设置,以免在存储多个空值字段的时候的唯一性限制失败。blank
False
, True
表示允许为空blank 与 null 区别: null是跟数据库相关的, blank是跟表单验证相关的。 当blank=True,表示允许输入一个空值 |
choice
((A, a), (B,b))
或者 [(A, a), (B,b)]
admin
界面显示(仅用于表示人工可读性)choice
中的一个get_FieldName_display()
方法获取元组第二个值class Person(models.Model):
gender = models.CharField(
max_length=6,
choices=(('M','Male'),('F','Famale')))
p = Person.objects.get(name='Fry')
p.gender() # 'M'
p.get_gender_display() # Male
db_column
column
的名称,Field
名作为字段名db_index
Ture
表示数据库会为该字段创建索引db_tablespace
settings
里的 DEFAULT_INDEX_TABLESPACE
。default
editable
True
False
表示该字段不会出现在 admin
或者其他 ModelForm
,model
校验的时候跳过error_messages
help_text
admin
模式下帮助文档primary_key
True
表示设置主键null=False
unique=True
unique
True
表示数据唯一, 不可重复unique_for_date
DateField
和 DateTimeField
设置该属性确保date
的唯一性title
和 pub_date
两个都相同的数据同时出现title=meta.CharField(maxlength=30,unique_for_date='pub_date'
unique_for_month
unique_for_year
validators
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
def validate_even(value):
if value % 2 != 0:
raise ValidationError(
_('%(value)s is not an even number'),
params={'value': value},
)
from django.db import models
class MyModel(models.Model):
even_field = models.IntegerField(
validators=[validate_even])
validator_list
django.core.validators.ValidationError
verbose_name
# 备注名:'One`s First Name'
first_name = models.CharFiels(
'One`s First Name',
max_length=20
)
# 备注名:first name
first_name = models.CharField(
max_length=20)
跳转目录
model
类添加id=models.AutoField(primary_key=True)
primary_key
,那么不会创建该默认字段id = models.AutoField([**options])
max_digits
:限定最大位数(含小数位)decimal_places
:小数位数Python
中的 decimal
对象Var = models.DecimalField(
max_digits=None,
decimal_places=None
[, **options])
Blank=True
CheckBoxInput
Var = models.BooleanField([**options])
BooleanField
null
Var = models.NullBooleanField([**options])
max_digits
:限定最大位数(含小数位)decimal_places
:小数位数Python
中的 float
对象NumberInput
Var = models.FloatField(
…,
max_digits=5,
decimal_places=2)
NumberInput
Var = models.IntegerField([**options])
Var = models.PositiveIntegerField([**options])
Var = models.PositiveSmallIntegerField([**options])
Var = models.SmallIntegerField([**options])
TextInput
Var = models.BigIntegerField([**options])
max_length
字符串最大长度TestInput
Var = models.CharField(
max_length=None[, **options])
CharField
类似admin
管理界面用
多行编辑框表示该字段Var = models.TestField(
max_length=None[, **options])
urls
表示db_index
默认为 True
Var = models.SlugField(
max_length=None[, **options])
url
的字符串verify_exists=True
会预先检查 url
可用性。不可用返回404响应。Var = models.URLField(
max_length=None[, **options])
CharField
EmailValidator
进行验证maxlength
参数Var = models.EmailField(
[max_length=75, **options])
datetime.date
的一个实例TextInput
auto_now
:一般表示最后修改时间。auto_now_add
:第一次创建时间。Var = models.DateField(
[auto_now=False,
auto_now_add=False,
**options])
datetime.time
的一个实例,类似 DateTime
TextInput
auto_now
, auto_now_add
Var = models.TimeField(
[auto_now=False,
auto_now_add=False,
**options])
datetime.datetime
的一个实例,类似 DateTime
TextInput
auto_now
, auto_now_add
Var = models.DateTimeField(
[auto_now=False,
auto_now_add=False,
**options])
upload_to
:
FileSystomStorage
,文件将储存到 setting
文件中配置的 MEDIA_ROOT
路径中instace
:定义了 FileField 的模型实例filename
:文件名称class WhatModel(models.Model):
# 文件保存路径 :MEDIA_ROOT/uploads
uploadfile = models.FileField(upload_to='uploads/')
# 或者也可以这么来:
# 文件保存路径: MEDIA_ROOT/uploads/2021/11/11
upload = models.FileField(upload_to='uploads/%Y/%m/%d/')
def my_file_path(instance, filename):
# 文件保存路径: MEDIA_ROOT/Dir_/
return 'Dir_{0}/{1}'.format(instance.user.id, filename)
class WhatModel(models.Model):
upload = models.FileField(upload_to=my_file_path)
path
:必须参数。目录的绝对路径match
:可选。一个正则表达式,用于过滤文件名recursive
:可选。是否包含 path
下子目录Var = FilePathField(
path=None,
[match=None,
recursive=False,
max_length=100,
**options])
protocol
可以为:both、ipv4、ipv6unpack_ipv4
默认禁用TextInput
IP
地址 Var = GenericIPAddressField(
protocol='both', # both ipv4 ipv6
unpack_ipv4=False,
**options)
Var = models.ImageField(
upload_to=None[,
height_field=None,
width_field=None,
max_length=100,
**options])
# uuid 生成的 'id' 重合几率非常非常非常非常小
import uuid
id = models.UUIDField(
primary_key=True,
default=uuid.uuid4,
editable=False)
跳转目录
class ForeignKey(
to,
on_delete,
**options)
关联的模型
、on_delete
多
的一方小写单数
,小写复数
。参数说明:
on_delete
CASCADE
: 将定义有外键的模型对象同时删除.PROTECT
: 阻止上面的删除操作, 但会弹出 ProtectedError
异常SET_NULL
: 将外键字段设为null
, 该字段必须设置null=True
SET_DEFAULT
: 将外键字段设为默认值, 只有当字段设置了 default
参数时, 方可使用该值.DO_NOTHING
: 什么也不做SET()
: 设置为一个传递给 SET()
的值或者一个回调函数的返回值.linit_choices_to
ModelForm
和 admin
staff = models.ForeignKey(
User,
on_delete=models.CASCADE,
limit_choices_to={'is_staff': True},
)
# ModelsForm的staff字段列表中,
# 只会出现哪些is_staff=True的Users对象
related_name
模型小写_set
作为反向关联名student.score_set.all()
的用法to_field
id
)unique=True
related_query_name
class Child(models.Model):
parent = models.ForeignKey('Parent')
name = models.CharField(max_length=4)
class Parent(models.Model):
pass
# 未设置 related_query_name
Parent.objects.filter(Child__name='靓仔')
# 设置 related_query_name=myboy
Parent.objects.filter(myboy__name='靓仔')
一些使用注意:
1.关联模型在当前模型之前
from django.db import models
class Student(models.Model):
#....
class score(models.Model):
student = models.ForeignKey(
Student,
on_delete=models.CASCADE)
2.关联模型在当前模型之后【通过字符串】
from django.db import models
class score(models.Model):
student = models.ForeignKey(
'Student',
on_delete=models.CASCADE)
class Student(models.Model):
#....
3.关联模型在其他app【在 student 这个 app】
from django.db import models
class score(models.Model):
student = models.ForeignKey(
'student.Student',
on_delete=models.CASCADE)
或者
from django.db import models
from student.models import Student
class score(models.Model):
student = models.ForeignKey(
Student,
on_delete=models.CASCADE)
4.自关联【典例:评论系统】
class Comment(models.Modle):
title = models.CharField(max_length=128)
text = models.TextField()
parent_comment = models.ForeignKey(
'self',
on_delete=models.CASCADE)
class ManyToManyField(
to,
**options)
多对多字段名
+包含该字段的模型名
+一个哈希码
db_table
自定义表名class OnToOneField(
to, on_delete,
parent_link=False,
**options)
跳转目录
Model 类
>>> stu = Student.objects.get(id=10010)
>>> stu.score_set.all()
<QuerySet [<Score: Score object (7)>, <Score: Score object (107)>, <Score: Score object (207)>]>
>>> b = Book.objects.get(id=1)
>>> b.authors.all()
[<Author:liushuchun>,<Author:nobb>]
>>> b.authors.filter(fisrt_name="liushuchun")
[<Author:liushuchun>]
class Student(CreateUpdateMixin):
student_num = models.CharField(...)
name = models.CharField(...)
gender = models.CharField(...)
phone = models.CharField(...)
birthday = models.DateField(...)
# user表一对一关联
user = models.OneToOneField(User, on_delete=models.CASCADE)
# teacher表一对多关联
teacher = models.ForeignKey(Teacher, on_delete=models.CASCADE) # 设置外键
def __str__(self):
return self.name
def teacher_name(self):
"""
获取老师名称
"""
self.verbose_name = '老师名称'
return self.teacher.name
# 自定义一个属性
teacher_name.short_description = '老师名称'
def class_name(self):
"""
获取班级名称
"""
return self.teacher.class_name
# 自定义一个属性
class_name.short_description = '班级名称'
跳转目录
管理器 Manager (.ojects)
【以 Student Models对象为例】
查
Student.objects.all()
Student.onjects.filter(filter)
Student.objects.get(filter)
Student.objects.order_by('-scoer')
-
代表按分数逆排序Student.objects.filter(filter).order_by()[0]
增
Student.objects.create()
from student.models import Student
# 方法一
Student.objects.create(name=None,
student_num=None,
gender=None,
...)
# 方法二 -- 需要 Student.save()
stu = Student(name=None,
student_num=None,
gender=None,
...)
stu.save()
from student.models import Student
students = []
for i in range(10):
students.append(Student(
name=None,
student_num=None,
gender=None,
...)
)
Student.objects.bulk_create(students) # 这么就完事了
改
stu = Student.objects.get(name='Fry')
stu.gender='male'
stu.name='Bender'
stu.save()
Student.objects.all().update(gender='F')
F
Student.objects.filter(filter).update(update)
删
Student.objects.filter(filter).delete()
其他
Student.filter(gender='male').count()
distinct()
跳转目录
filter()
exclude()
与filter
作用相反# 筛选所有 gender='famale' 字段
Student.objects.filter(gender='famale')
# 筛选所有 gender != 'famale' 字段
Student.objects.exclude(gender='famale')
filter表达式
表达式 | 说明 |
---|---|
__exact | 精确等于 |
__iexact | 精确等于,但忽略大小写 |
__contains | 包含 |
__icontains | 包含,但忽略大小写 (对于sqlite来说,contains的作用效果等同于icontains。) |
__gt | 大于 |
__gte | 大于等于 |
__lt | 小于 |
__lte | 小于等于 |
__in | 存在于一个list范围内 |
__startswith | 以…开头 |
__istartswith | 以…开头 忽略大小写 |
__endswith | 以…结尾 |
__iendswith | 以…结尾,忽略大小写 |
__range | 在…范围内 |
__year | 日期字段的年份 |
__month | 日期字段的月份 |
__day | 日期字段的日 |
__isnull | =True/False |
# 筛选分数大于 60的
Student.objects.filter(score__gt=60)
# student 是 score 的外键时
Student.objects.filter(score_score__gt=60)
score / models.py
from django.db import models
from student.models import Student
class Score(models.Model):
score = models.DecimalField(...)
student = models.ForeignKey(Student,...)
from django.db import models
class Student(models.Model):
name = models.CharField(...)
student_num = models.CharField(...)
# ....
class Score(models.Model):
score = models.Decimal(...)
student = models.ForeignKey(Studetn,...)
>>> Student.objects.filter(score__score__gt=60)
....
>>> Score.objects.filter(student__name__contains='李')
...
related_name
from django.db import models
class Student(models.Model):
name = models.CharField(...)
student_num = models.CharField(...)
# ....
class Score(models.Model):
score = models.Decimal(...)
student = models.ForeignKey(Studetn,related_name='stu')
# Student.objects.filter(score__score__gt=60)
>>> res = Student.objects.filter(stu__gt=60)
# 或者 Student.objects.filter(stu__score__gt=60)
>>> res[0].stu.all() # 之前 res[0].score_set.all()
...
>>> res0 = Score.objects.filter(student__name__contains='李')
>>> res0[0].student.name
'李亮'
&
或 |
非 ~
from django.db.models import Q
cool = Student.objects.filter(Q(name__contains='cool'))
Student.objects.filter(Q(filterA), Q(filterB) | ~Q(filterC))
查询条件表达式: filterA
& ( filterB
| (~filterC
))
filterA and (filterB or (not filterC))
Student.objects.get(
Q(name='Fry') & Q(age__lt=30),
score__gt=50
)
跳转目录
from django.db import models
class CarManager(models.Manager):
'''
自定义一个管理器,
继承默认管理器
'''
def title_count(self, kword):
# 继承自父类Manager的 filter 方法
return self.filter(name__contains=kwords).count()
class Car(models.Model):
name=CharField(..)
#...
# 更改默认管理器
objects = BookManager()
def __unicode__(self):
return self.name
Car.objects.all()
返回的时所有记录对象Manager
的 get_query_set()
方法更改返回值filter
slice
等操作都是基于这个自定义的 QuerySet
from django.db import models
class CarManager(models.Manager):
def get_query_set(self):
#调用父类的方法,在原来返回的QuerySet的基础上返回新的QuerySet
return super().get_query_set().filter(name__icontains='be')
class Car(models.Model):
name = models.CharField(max_length=100)
# ...
#objects默认管理器需要显示声明,才能使用
objects = models.Manager() # 默认的管理器
car_objects = RogerBookManager() # 自定义的管理器,用新变量
from django.db import connection, models
class BookManager(models.Manager):
def books_titles_after_publication(self, date_string):
cursor = connection.cursor()
cursor.execute("""
SELECT title
FROM books_book
WHERE publication_date > %s""", [date_string])
#fetchall()返回的是元组的列表
return [row[0] for row in cursor.fetchall()]
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField(blank=True, null=True)
num_pages = models.IntegerField(blank=True, null=True)
objects = models.Manager()
python_objects = PythonBookManager()
from django.db import connection
可以返回一个数据库连接对象跳转目录
Meta 类
from django.db import models
class Student(models.Model):
name = ...
student_num = ...
gender = ...
...
class Meta:
ordering = ['student_num']
verbose_name = '学生信息'
verbose_name_plural = '学生信息'
abstract
abstract = True
app_label
app_label = 'myapp'
db_table
db_tablespace
model
所使用的的数据库表空间。setting
中定义,那么它会使用这个值get_latest_by
model
中指定一个DateField
或者 DateTimeFiled
。managed
True
,意味着Django
可以使用syncdb
和reset
命令来创建或移除对应的数据库。order_with_respect_to
get_XXX_order()
和 set_XXX_order()
方法,通过这两个方法可以设置或者获取排序的对象ordering
-
表示逆序,?
将会随机排列ordering = ['sid']
ordering = ['-sid']
ordering = ['?sid']
# 先按 sid 升序, 再按 author 降序
ordering = ['sid', '-author']
permissions
proxy
unique_together
verbose_name
verbose_name = 学生信息
verbose_name_plural
's'