用户模块创建,app user
(base) G:\dailyfresh>python manage.py startapp user
用户应用的注册
在配置中添加应用的名称即可
回顾要设计的模型类
用户表与地址表
一对多对应关系
用户表为一方
地址表为多方
用户模型类的设计
复用django自带的用户认证的体系
因为django自带了一些用户的字段,我们直接继承复用就好
from django.db import models
from django.contrib.auth.models import AbstractUser
from db.base_model import BaseModel
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
from django.conf import settings
class User(AbstractUser, BaseModel):
"""用户模型类"""
def generate_active_token(self):
"""生成用户签名字符串"""
serializer = Serializer(settings.SECRET_KEY, 3600)
info = {'confirm': self.id}
token = serializer.dump(info)
return token.decode()
class Meta:
db_table = 'df_user'
verbose_name = '用户'
verbose_name_plural = verbose_name
class Meta , 用于设置数据表的相关内容,详细的配置写在该类的类属性中
db_table, 类属性,用于定义当前的模型类User在迁移生成数据表时,以什么表名来显示
verbose_name , 用于在后台管理中,以什么名称来显示这个表
留意报错情况
生成迁移文件时,会有报错情况发生
(base) G:\dailyfresh>python manage.py makemigrations
SystemCheckError: System check identified some issues:
ERRORS:
auth.User.groups: (fields.E304) Reverse accessor for 'User.groups' clashes with reverse ac
cessor for 'User.groups'.
HINT: Add or change a related_name argument to the definition for 'User.groups' or
'User.groups'.
auth.User.user_permissions: (fields.E304) Reverse accessor for 'User.user_permissions' cla
shes with reverse accessor for 'User.user_permissions'.
HINT: Add or change a related_name argument to the definition for 'User.user_permi
ssions' or 'User.user_permissions'.
user.User.groups: (fields.E304) Reverse accessor for 'User.groups' clashes with reverse ac
cessor for 'User.groups'.
HINT: Add or change a related_name argument to the definition for 'User.groups' or
解决报错,配置中指定用户认证的
AUTH_USER_MODEL = "user.User"
解决好后再次生成迁移文件
问题解决
不再报错
小结,用户模型类的操作,主要两步
》一,用户模型类
1,用户模型类继承,django的抽象用户类
2,继承自定义的基类
》二,配置
告诉django用户表用哪个表
迁移操作
》迁移前,数据库中
》生成迁移文件
(base) G:\dailyfresh>python manage.py makemigrations
》迁移数据,生成数据表
命令
(base) G:\dailyfresh>python manage.py migrate
效果
(base) G:\dailyfresh>python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, user
Running migrations:
Applying contenttypes.0001_initial... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0001_initial... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying user.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying sessions.0001_initial... OK
(base) G:\dailyfresh>
》迁移后,数据表中
》用户表的表结构如下
地址模型类的定义
》先演示一个错误的定义方式
这是django 1版本的定义方式
会报如下错误:
File "G:\dailyfresh\user\models.py", line 23, in <module>
class Address(BaseModel):
File "G:\dailyfresh\user\models.py", line 25, in Address
user = models.ForeignKey("User", verbose_name="所属帐户")
TypeError: __init__() missing 1 required positional argument: 'on_delete'
正解,外键字段需要加上 on_delete
》定义地址模型类
class Address(BaseModel):
"""地址模型类"""
user = models.ForeignKey("User", verbose_name="所属帐户", on_delete=models.CASCADE)
receiver = models.CharField(max_length=20, verbose_name="收件人", )
addr = models.CharField(max_length=256, verbose_name="收货地址")
zip_code = models.CharField(max_length=6, null=True, verbose_name="邮政编码")
phone = models.CharField(max_length=11, verbose_name="联系电话")
is_default = models.BooleanField(default=False, verbose_name="是否默认")
class Meta:
db_table = "df_address"
verbose_name = "地址"
verbose_name_plural = verbose_name
》生成迁移文件
不会再报错
》迁移数据
》最终地址表结果
。。。
用户模块的表到此创建完成