目录
一,模型
1,所有模型的字段类型
__all__ = [
'AutoField', 'BLANK_CHOICE_DASH', 'BigAutoField', 'BigIntegerField',
'BinaryField', 'BooleanField', 'CharField', 'CommaSeparatedIntegerField',
'DateField', 'DateTimeField', 'DecimalField', 'DurationField',
'EmailField', 'Empty', 'Field', 'FilePathField', 'FloatField',
'GenericIPAddressField', 'IPAddressField', 'IntegerField', 'NOT_PROVIDED',
'NullBooleanField', 'PositiveBigIntegerField', 'PositiveIntegerField',
'PositiveSmallIntegerField', 'SlugField', 'SmallAutoField',
'SmallIntegerField', 'TextField', 'TimeField', 'URLField', 'UUIDField',
]
2,模型字段属性
max_length : 字段长度限制
null : 可选值为 True, False 字段是否为空 null。此字段与数据库相关
bland : 可选值为 True, False 表单验证时此字段是否可以不填。此字段与验证相关
choices : 可迭代(例如,列表或元组),用作该字段的选择。如果指定了此选项,则默认表单窗口小部件将是一个选择框,而不是标准文本字段,并将选择范围限制为给定的选项。
default : 字段的默认值
help_text : 字段备注,字段帮助文档。admin后台会显示文案提示
primary_key : 是否为主键
unique : 字段是否唯一
verbose_name : 后台显示的字段名称
ForeignKey 字段 属性
creater = models.ForeignKey(to=DemandUser, related_name="DemandList_creater", related_query_name="user_name",
on_delete=models.CASCADE, help_text="创建人", verbose_name="创建人")
to : 模型类, 外键关联的其他模型类名称
related_name :
related_query_name :
on_delete=models.CASCADE :级联删除:删除时也删除关联其他表的信息 ;DO_NOTHING:不采取行动;PROTECT:通过引发ProtectedError
的子类来 防止删除引用的对象 django.db.IntegrityError
。;RESTRICT:通过引发RestrictedError
(的子类 django.db.IntegrityError
)防止删除引用的对象 。不同于PROTECT
,如果引用的对象还引用了在同一操作中通过CASCADE
关系删除的另一个对象,则允许删除该对象。
auto_now_add : 第一次创建的时间,默认为False, 设置为True以后该字段不会被更改
auto_now : 默认为False, 设为True后, 每次修改该字段,自动更新该字段时间
3 , Model的Meta选项
class User(AbstractUser):
username = models.CharField(max_length=15, verbose_name="用户名", unique=True)
class Meta:
db_table = "auth_user"
verbose_name = "用户"
verbose_name_plural = verbose_name
db_table : 指定model类在数据库内的表名
ordering = ['-order_date'] :对象的默认顺序,用于在获取对象列表时使用:
get_latest_by : 一个字段的名称或字段名称的模型的列表 get_latest_by = ['-priority', 'order_date'] # 根据priority倒叙,根据order_date 正旭排列
permissions = [('can_deliver_pizzas', 'Can deliver pizzas')] # 创建此对象时,要在权限表中输入额外的权限。将为每个模型自动创建添加,更改,删除和查看权限
default_permissions : 您可以自定义此列表,例如,如果您的应用不需要任何默认权限,可以将其设置为空列表。在创建模型之前,必须在模型上指定它,以防止创建任何遗漏的权限。('add', 'change', 'delete', 'view')
verbose_name : 该对象的人类可读名称(单数)
verbose_name_plural:
该对象的人类可读名称(复数) 如果未指定,Django将使用verbose_name
+ "s"
。
关于Meta 的官方文档:https://docs.djangoproject.com/en/3.2/ref/models/options/
二, 增删改查方法 官方文档
filter()
get()
order_by()
reverse()
distinct(
* fields)
values
(* fields,** expressions)
values_list
(* fields,flat = False,named = False)
dates
(field,kind,order ='ASC')
>>> Entry.objects.dates('pub_date', 'year')
[datetime.date(2005, 1, 1)]
>>> Entry.objects.dates('pub_date', 'month')
[datetime.date(2005, 2, 1), datetime.date(2005, 3, 1)]
>>> Entry.objects.dates('pub_date', 'day')
datetimes
(field_name,kind,order ='ASC',tzinfo = None) kind
应该是"year"
,"month"
,"day"
,"hour"
, "minute"
或"second"
annotate
(* args,** kwargs) # 聚合查询 sum(), max(), min(), avg(),count()
>>> from django.db.models import Count
>>> q = Blog.objects.annotate(Count('entry'))
all()
union
(* other_qs,all = False)
>>> qs1 = Author.objects.values_list('name')
>>> qs2 = Entry.objects.values_list('headline')
>>> qs1.union(qs2).order_by('name')
intersection()
difference
(* other_qs)
extra
(select = None,where = None,params = None,表= None,order_by = None,select_params = None)
>>> qs.extra(
... select={'val': "select col from sometable where othercol = %s"},
... select_params=(someparam,),
... )
等效于:
>>> qs.annotate(val=RawSQL("select col from sometable where othercol = %s", (someparam,)))
only
(* fields) # 只根据某一个字段查询
defer
(* fields)# 不根据某些字段查询 与only() 相反
select_for_update
(nowait = False,skip_locked = False,of =()) # 锁定查询,查询时会锁定数据
raw
(raw_query,params = None,translations = None) # 进行原始sql查询
get()
create
(** kwargs)
get_or_create
(默认值= None,** kwargs) # 有则返回,无则创建.返回objects 和 created 。 created为True时,说明是新建
update_or_create
(默认值= None,** kwargs)# 有则更新,无则创建.返回objects 和 created 。 created为True时,说明是新建
count()
latest
(* fields) # 根据给定的字段返回表中的最新对象。
earliest
(* fields)# 与lastes()除方向改变外,其他操作方式相同。
first()
last()
aggregate
(* args,** kwargs) # 返回在上计算出的合计值(平均值,总和等)
>>> from django.db.models import Count
>>> q = Blog.objects.aggregate(Count('entry'))
{'entry__count': 16}
通过使用关键字参数指定聚合函数,可以控制返回的聚合值的名称:
>>> q = Blog.objects.aggregate(number_of_entries=Count('entry'))
{'number_of_entries': 16}
exists() # 判断数据是否存在
update
(** kwargs) # 对指定的字段执行SQL更新查询,并返回匹配的行数(如果某些行已经具有新值,则该行数可能不等于更新的行数)。
>>> Entry.objects.filter(pub_date__year=2010).update(comments_on=False, headline='This is old')
delete()
三,字段查找
exact # 某一字段完全符合
Entry.objects.get(id__exact=14)
Entry.objects.get(id__exact=None)
iexact #
不区分大小写的完全匹配
contains #
区分大小写的匹配 等效 like %XXX%
icontains # 不
区分大小写的匹配
in # 包含
gt # 大于
gte # 大于等于
lt # 小于
lte # 小于等于
startswith # 区分大小写的 开头为XXX的字段
istartswith # 不区分大小写的 开头为XXX的字段
endswith # 区分大小写的 结尾为XXX的字段
iendswith # 区分大小写的 结尾为XXX的字段
range # 范围
Entry.objects.filter(pub_date__range=(start_date, end_date)) 等效 SELECT ... WHERE pub_date BETWEEN '2005-01-01' and '2005-03-31';
date #
对于日期时间字段,将值强制转换为日期。允许链接其他字段查找。取一个日期值。
year #
对于日期和日期时间字段,精确匹配年份。允许链接其他字段查找。需要一个整数年。
month #
对于日期和日期时间字段,精确匹配月份。允许链接其他字段查找。取整数1(一月)到12(十二月)
day #
对于日期和日期时间字段,精确匹配日期。允许链接其他字段查找。需要整数天。
week # 对于日期和日期时间字段,根据ISO-8601返回星期数(1-52或53),即,星期从星期一开始,而第一周包含年份的第一个星期四
week_day #
对于日期和日期时间字段,“星期几”匹配。允许链接其他字段查找。取一个整数值,表示从1(星期日)到7(星期六)的星期几。
time # 对于日期时间字段,将值强制转换为时间。允许链接其他字段查找。需要一个datetime.time
值
Entry.objects.filter(pub_date__time=datetime.time(14, 30))
Entry.objects.filter(pub_date__time__range=(datetime.time(8), datetime.time(17)))
hour #
对于日期时间和时间字段,精确的小时匹配。允许链接其他字段查找。取0到23之间的整数。
例子:
Event.objects.filter(timestamp__hour=23)
Event.objects.filter(time__hour=5)
Event.objects.filter(timestamp__hour__gte=12)
minute #
对于日期时间和时间字段,精确匹配分钟。允许链接其他字段查找。取0到59之间的整数。
second #
对于日期时间和时间字段,精确匹配第二个。允许链接其他字段查找。取0到59之间的整数
isnull #
采用任一True
或False
,其对应于SQL查询的 和分别。IS NULL ,
IS NOT NULL
regex #
区分大小写的正则表达式匹配。
iregex # 不
区分大小写的正则表达式匹配。