Django模型的简单使用
Django模型的参数笔记
1、通用参数
-
max_length长度 -
unique是否唯一 -
null数据库是否可以为null -
blank前端是否必填 -
primary_key是否为主键 -
default默认值 -
choices可选值
2、外键参数
2.1、to_field 指定关联的字段
如果不使用to_filed,默认关联的是ID,例如:
group表中有一条ID是1的记录
user表中关联的字段就是group中的ID字段
如果使用to_filed,默认关联的是指定字段,如果该字段不存在,则会报错
使用to_filed关联group表的name字段to_field="name",name字段需要是唯一,因为关联是唯一的,例如
group表中有一条ID是1的记录
user表中关联的字段就是group中的name字段
可以看到关联字段是name字段了,但是字段名还是显示以id关联,通过db_column指定
2.2、db_column 指定字段名
使用了db_column="group_name"
2.3、related_name 反向关系
举例:一个用户组可以拥有多个用户,而一个用户只能属于一个用户组,用户组对于用户属于一对多
正向查询:查询某个用户属于的组
user: User = User.objects.filter(name="admin").first()
user_group = user.group
print(user_group)
反向查询:查询某个用户组拥有的用户是哪些
通过模型名称_set来指定反向关系(本例子就是user_set)
admin_group = Group.objects.filter(name="admin组").first()
users = admin_group.user_set.all()
print(users)
上面是不使用related_name的情况,使用了related_name就可以直接使用related_name="group_users"指定的名字来反向了
admin_group = Group.objects.filter(name="admin组").first()
users=admin_group.group_users.all()
3、模型代码
from django.db import models
class User(models.Model):
id = models.AutoField(primary_key=True)
uid = models.CharField("用户ID", max_length=30, unique=True, null=False, blank=False)
name = models.CharField("用户名", max_length=30, unique=True, null=False, blank=False)
email = models.EmailField("用户邮箱", max_length=30, unique=True, null=False, blank=False)
group = models.ForeignKey(
"Group",
on_delete=models.SET_NULL,
null=True,
blank=True,
default=None,
to_field="name", # 指定关联字段 (默认是id)
db_column="group_name", # 指定列名 (默认是模型名称_id例如:group_id)
related_name="group_users" # 指定反向关系 (默认是模型名称_set例如:user_id)
)
created = models.DateTimeField("创建时间", auto_now_add=True)
updated = models.DateTimeField("修改时间", auto_now=True)
class Group(models.Model):
id = models.AutoField(primary_key=True)
gid = models.CharField("用户组ID", max_length=30, unique=True, null=False, blank=False)
name = models.CharField(
"用户组名称", max_length=30, unique=True, null=False, blank=False
)
created = models.DateTimeField("创建时间", auto_now_add=True)
updated = models.DateTimeField("修改时间", auto_now=True)