Django的数据迁移以及模型关系
`
文本
CharField、TextField——字符串、文本 FileField、ImageField——文件、图片 FilePathField——文件路径 EmailField——邮件地址 URLField——URL地址 max_length——最大长度
数字(整数)
IntegerField——整数 BooleanField——布尔值(1,0) SmallIntegerField——整数 BigIntegerField——整数 PositiveIntegerField——正整数
数字(小数)
FloatField、DecimalField——小数
日期与时间
DateField——日期 TimeField——时间 DateTimeField——日期时间
特殊类型
OneToOneField——一对一关联 ForeignKey——外键关联 ManyToManyField——多对多关联 GenericForeignKey——复合关联`
抽象基类
使用场景: CommonModel() 我们将表中公共的字段放在抽象基类中,只需要继承这个抽象类即可
数据迁移模型的创建
from django.db import models
class CommonModel(models.Model):
""" 自定义模型的基类 """
created_at = models.DateTimeField('添加时间', auto_now_add=True)
updated_at = models.DateTimeField('最后修改时间', auto_now=True)
class Meta:
# 抽象类,这个类,并不会生成对应的数据库表
abstract = True
class User(CommonModel):
""" 用户基本信息 """
USER_STATUS = (
(1, '正常'),
(0, '删除'),
)
username = models.CharField('用户名', max_length=128, unique=True)
password = models.CharField('密码', max_length=256)
nickname = models.CharField('用户昵称', max_length=256, null=True, blank=True)
avatar = models.ImageField('用户头像', upload_to='avatar', null=True, blank=True)
status = models.SmallIntegerField('用户状态', default=1, choices=USER_STATUS)
is_super = models.BooleanField('是否为超级用户', default=False)
created_at = models.DateTimeField('注册时间', auto_now_add=True)
updated_at = models.DateTimeField('更新时间', auto_now=True)
class Meta:
db_table = 'accounts_user'
class UserProfile(CommonModel):
""" 用户详细信息 """
SEX_CHOICES = (
(0, '未知'),
(1, '男'),
(2, '女'),
)
user = models.OneToOneField(User, verbose_name='关联用户',
related_name='profile',
on_delete=models.CASCADE)
username = models.CharField('用户名', max_length=128, unique=True)
real_name = models.CharField('真实姓名', max_length=128, null=True, blank=True)
sex = models.SmallIntegerField('用户性别', default=0, choices=SEX_CHOICES)
maxim = models.CharField('用户格言', max_length=128, null=True, blank=True)
address = models.CharField('用户地址', max_length=128, null=True, blank=True)
class Meta:
db_table = 'accounts_user_profile'
class LoginHistory(models.Model):
""" 用户的登录历史 """
user = models.ForeignKey(User, related_name='login_history_list',
on_delete=models.CASCADE,
verbose_name='关联的用户')
username = models.CharField('用户名', max_length=128)
login_type = models.CharField('账号平台', max_length=128)
ip = models.CharField('IP地址', max_length=32, default='')
ua = models.CharField('登录来源', max_length=128, default='')
created_at = models.DateTimeField('登录时间', auto_now_add=True)
class Meta:
db_table = 'accounts_login_history'
ordering = ['-created_at']
ORM模型关系
`
- 一对一: OneToOneFiled
- 一对多: ForeignKey
- 多对多: ManyToManyField
- to(必传)---关联的模型可以传(模型类,模型字符串, self)均可传 self代表关联自身
- on_delete(必传)----删除选项(
CASCADE关联删除
PROTECT受保护 SET_NULL 设置成None,需要添加选项null=True SET_DEFAULT 默认值 SET() 传参设置值 DO_NOTHING 什么也不做
)
- related_name (可选) 是否需要反向引用,反向引用名称
- related_query_name 反向引用的名称
- 注意:当你的关联模型在最上面可以User,如果在下面必须'User'
user = models.OneToOneField(User)
# 一对一关联
class Profile(CommonModel):
# zhangsan = User()
# zhangsan.profile 拿到张三的基础信息
user = models.OneToOneField(User,on_delete=models.CASCADE,related_name='profile')
# 默认关联字段 user_id
# user = models.OneToOneField(User,on_delete=models.CASCADE,related_name='profile',db_column='user')
nickname = models.CharField('昵称',max_length=64)
# 外键关联 一对多
class Question(CommonModel):
name = models.CharField('问题名称', max_length=64)
class Answer(CommonModel):
# 外键关联
question = models.ForeignKey(Question, on_delete=models.CASCADE, related_name='answers',verbose_name='关联的问题')
content = models.TextField('答案内容那个', max_length=64)
# 多对多 用户收藏问题 问题也可以被多个用户收藏
class User(CommonModel):
name = models.CharField('姓名', max_length=64)
sex = models.CharField('性别',max_length=1, choices=(
('1', '男'),
('0', '美女')
),default='1')
age = models.PositiveIntegerField('年龄',default=0)
username = models.CharField('用户名',max_length=64, unique=True)
password = models.CharField('密码', max_length=256)
remark = models.CharField('备注信息', max_length=64, null=True, blank=True)
email = models.EmailField('用户邮箱', max_length=64, null=True, blank=True)
# class Meta:
# db_table = 'dj_user'
# 多对多
collect_ques = models.ManyToManyField('Question')`
## 执行
- python manage.py check #检测语法
- python manage.py makemigrations #生成迁移文件
- python manage.py migrate # 同步到mysql中