Django中的数据迁移以及模型的创建

218 阅读3分钟

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中