表结构
字段类型
字段 | 备注 |
---|
AutoField | 自增列, 必须填入 primary_key=True, 如果没有该列, 会自动创建一个名为 id 的列 |
IntegerField | 10 位内数字 |
CharField | 字符串类型, 必须填如 manx_length 参数限制长度 |
DateField | YYYY-MM-DD, 相当于 datetime.date() |
DateTimeField | YYYY-MM-DD HH:MM:[:ss:[.uuuuuu]], 相当于 datetime.datetime() |
参数约束
参数 | 注释 |
---|
null | 是否允许为空 |
unique | 是否唯一 |
db_index | 设置为索引 |
default | 设置默认值 |
auto_now_add=True | 记录创建时间 |
auto_now=True | 记录变更时间 |
单表
表结构
class Person(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=16, null=False)
age = models.IntegerField(null=True, blank=True)
phone = models.CharField(max_length=11, unique=True)
数据的操作
增
- 单独增
models.Publisher.objects.create(name="Gury", age=19, phone="1231231234")
- 批量增
p_list = [ models.Publisher(name="xx-{}".format(i)) for i in range(100) ]
models.Publisher.objects.bulk_create(p_list)
查
- 基础查询
models.Person.objects.all()
models.Person.objects.filter(id=1)
models.Person.objects.get(id=1)
models.Person.objects.all().values("name", "phone")
models.Person.objects.all().values_list("name", "phone")
models.Person.objects.exclude(id=1)
models.Person.objects.all().order_by("id")
models.Person.objects.all().order_by("id").reverse()
models.Person.objects.all().count()
models.Person.objects.all().first()
models.Person.objects.all().last()
models.Person.objects.filter(id=1).exists()
distinct()
- 进阶查询(双下划线用法)
models.Person.objects.filter(id__gt=1)
models.Person.objects.filter(id__lt=2)
models.Person.objects.filter(id__gte=1)
models.Person.objects.filter(id__lte=2)
models.Person.objects.filter(id__in=[1,3])
models.Person.objects.exclude(id__in=[1,2])
models.Person.objects.filter(name__contains="t")
models.Person.objects.filter(name__icontains="T")
models.Person.objects.filter(id__range=[1,4])
models.Person.objects.filter(name__startswith="T")
models.Person.objects.filter(name__endswith="m")
models.Person.objects.filter(birthday__year=2018)
改
obj = models.Person.objects.get(id=1)
obj.name = "new_name"
obj.books.set([1, 2, 3])
obj.books.add(4)
obj.save()
删
models.Publisher.objects.get(id=1).delete()
多表 – ForeignKey
表结构
"""
一个 Leader 领导多个 Staff
leader -- 基础表 -- "一"
staff -- 外键表 -- "多"
"""
class Leader(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=15)
def __str__(self):
return self.name
class Staff(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=15)
leader = models.ForeignKey(to=Leader, on_delete=models.CASCADE)
def __str__(self):
return self.name
查询
- 基于 obj , 外键表查基础表
obj = models.Staff.objects.get(id=1)
r = obj.leader.name
- 基于 obj, 基础表查外键表(外键表_set 的使用)
obj = models.Leader.objects.get(id=1)
qs = obj.staff_set.all()
r = qs.values_list("name")
- 基于 QuerySet, 外键表查基础表
qs = models.Staff.objects.filter(id=1)
r = qs.values_list("leader__name")
- 基于 QuerySet, 基础表查外键表(用法与基于 QuerySet, 外键表查基础表相同)
qs = models.Leader.objects.filter(id=1)
r = qs.values_list("staff__name")
多表 – ManyToManyField
表结构
class Leader(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=15)
def __str__(self):
return self.name
class Staff(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=15)
leader = models.ManyToManyField(to=Leader, related_name="yuangong")
def __str__(self):
return self.name
查询
- 基于 obj, 外键表查基础表
obj = models.Staff.objects.first()
qs = obj.leader.all()
r = qs.values_list("name")
- 基于 obj, 基础表查询外键表(用法与基于 obj, 外键表查基础表相同)
obj = models.Leader.objects.first()
qs = obj.staff.all()
r = qs.values_list("name")
- 基于 QuerySet, 外键表查基础表(通过 to 参数)
qs = models.Staff.objects.filter(id=1)
r = qs.values_list("leader__name")
- 基于 QuerySet, 基础表查外键表(通过 related_name 参数)
qs = models.Leader.objects.filter(id=1)
r = qs.values_list("yuangong__name")