Django小记 模型-Model模块


文章目录

  • 常用字段
    • Field 常用参数:
    • 普通字段
    • 关系字段
  • Model 类
    • 访问外键、多对多对象
    • 自定义方法
  • 管理器 Manager (.ojects)
    • 常用方法【增-删-改-查】
    • 查询方法-细讲
      • filter() 和 exclude()
      • 多表连接查询【外键】
      • Q 查询
    • 自定义管理器
      • 添加新方法
      • 修改返回的QuerySet
      • 执行自定义SQL语句
  • Meta 类
    • 属性


常用字段

   列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()

Field 常用参数:

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=Trueblank=True 属性的特例情况下,null=True 需要被设置,以免在存储多个空值字段的时候的唯一性限制失败。

  • blank
    • 默认为 False, True表示允许为空
blank 与 null 区别:
null是跟数据库相关的, blank是跟表单验证相关的。
当blank=True,表示允许输入一个空值

  • choice
    • 2维元组。((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
    • 设置默认值
    • 默认值不可以时可变类型(list,set…)

  • editable
    • 默认为 True
    • False 表示该字段不会出现在 admin 或者其他 ModelForm,
    • 同时在 model 校验的时候跳过

  • error_messages
    • 可以重写字段的提示信息

  • help_text
    • admin 模式下帮助文档

  • primary_key
    • True表示设置主键
    • 同时意味着
      • null=False
      • unique=True
    • 主键字段是只可读的,如果你修改一个模型实例该字段的值并保存,你将等同于创建了一个新的模型实例。

  • unique
    • True 表示数据唯一, 不可重复
  • unique_for_date
    • 日期唯一。
    • DateFieldDateTimeField 设置该属性确保date的唯一性
    • 下例将不允许 titlepub_date 两个都相同的数据同时出现
      title=meta.CharField(maxlength=30,unique_for_date='pub_date'
  • unique_for_month
    • 用法同上
  • unique_for_year
    • 用法同上

  • validators
    • 字段校验。【Django官方文档】
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)

跳转目录


普通字段

  • AutoField()
    • 自增字段
    • Django默认给每个model类添加id=models.AutoField(primary_key=True)
    • 如果其他字段设置了 primary_key,那么不会创建该默认字段
id = models.AutoField([**options])

  • DecimalField()
    • 混合精度的小数型数字字段。两个必需参数:
    • max_digits:限定最大位数(含小数位)
    • decimal_places:小数位数
    • 在内部使用 Python 中的 decimal 对象
Var = models.DecimalField(
	max_digits=None, 
	decimal_places=None
	[, **options])

  • BooleanField()
    • 布尔型字段
    • 不能为空,Blank=True
    • 默认表单窗口部件为:CheckBoxInput
Var = models.BooleanField([**options])

  • NullBooleamField()
    • 类似 BooleanField
    • 不同是其可以允许值为 null
Var = models.NullBooleanField([**options])

  • FloatField()
    • 浮点字段,两个必需参数:
    • max_digits:限定最大位数(含小数位)
    • decimal_places:小数位数
    • 在内部使用 Python 中的 float 对象
    • 默认表单组件 NumberInput
Var = models.FloatField(
	…,
	max_digits=5, 
	decimal_places=2)

  • IntegerField()
    • 整型字段
    • 默认表单组件 NumberInput
Var = models.IntegerField([**options])

  • PositiveIntegerField()
    • 非负整数
Var = models.PositiveIntegerField([**options])

  • PositiveSmallIntegerField()
    • 非负整数,取值范围稍小
Var = models.PositiveSmallIntegerField([**options])

  • SmallIntegerField()
    • 整型,取值范围稍小
Var = models.SmallIntegerField([**options])

  • BigIntegerField()
    • 64位整型数
    • 默认表单组件 TextInput
Var = models.BigIntegerField([**options])

  • CharField()
    • 字符型字段,一必需参数:
    • max_length 字符串最大长度
    • 默认表单组件 TestInput
Var = models.CharField(
	max_length=None[, **options])

  • TextField()
    • 文本类型,与 CharField 类似
    • admin 管理界面用