目录

1.用户模型的创建

2.Marshmallow模块

3.MarshMallow基本构造器:Schema

  1.基于Schema完成数据序列化转换

  2.基于Schema完成数据反序列化转换

  3.反序列化阶段对数据进行校验

1.用户模型的创建

我们当前开发的项目属于社交类型项目,所以关于用户的信息和功能直接贯穿了整个项目。所以此处实现用户模块功能,我们先把用户基本信息构建起来,并通过基本信息实现用户注册登录相关功能,后面遇到业务再继续扩展。

1.创建用户蓝图/注册用户蓝图/添加总路由

  1. cd application/apps
  2. python ../../manage.py blue -n users

application/settings/dev.py

  1. # 注册蓝图
  2. INSTALLED_APPS = [
  3. "application.apps.home",
  4. "application.apps.users",
  5. ]

application/urls.py

  1. from application.utils import include
  2. urlpatterns = [
  3. include("","home.urls"),
  4. include("/users","users.urls"), # ***
  5. ]

2.用户相关模型

1.公共模型:BaseModel

application/model/utils.py

  1. from application import db
  2. from datetime import datetime
  3. class BaseModel(db.Model):
  4. """公共模型"""
  5. __abstract__ = True # 抽象模型
  6. id = db.Column(db.Integer, primary_key=True, comment="主键ID")
  7. name = db.Column(db.String(255), default="", comment="名称/标题")
  8. is_deleted = db.Column(db.Boolean, default=False, comment="逻辑删除")
  9. orders = db.Column(db.Integer, default=0, comment="排序")
  10. status = db.Column(db.Boolean, default=True, comment="状态(是否显示,是否激活)")
  11. created_time = db.Column(db.DateTime, default=datetime.now, comment="创建时间")
  12. updated_time = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间")
  13.  
  14. def __repr__(self):
  15. return "<%s: %s>" % (self.__class__.__name__, self.name)

2.用户模型:User/UserProfile

application/apps/users/models.py

  1. from application.utils.models import BaseModel,db
  2. from werkzeug.security import generate_password_hash, check_password_hash
  3.  
  4. class User(BaseModel):
  5. """用户基本信息表"""
  6. __tablename__ = "mf_user"
  7. name = db.Column(db.String(255), index=True, comment="用户账户")
  8. nickname = db.Column(db.String(255), comment="用户昵称")
  9. _password = db.Column(db.String(255), comment="登录密码")
  10. age = db.Column(db.SmallInteger, comment="年龄")
  11. money = db.Column(db.Numeric(7,2), comment="账户余额")
  12. ip_address = db.Column(db.String(255), default="", index=True, comment="登录IP")
  13. intro = db.Column(db.String(500), default="", comment="个性签名")
  14. avatar = db.Column(db.String(255), default="", comment="头像url地址")
  15. sex = db.Column(db.SmallInteger, default=0, comment="性别" ) # 0表示未设置,保密, 1表示男,2表示女
  16. email = db.Column(db.String(32), index=True, default="", nullable=False, comment="邮箱地址")
  17. mobile = db.Column(db.String(32), index=True, nullable=False, comment="手机号码")
  18. unique_id = db.Column(db.String(255), index=True, default="", comment="客户端唯一标记符")
  19. province = db.Column(db.String(255), default="", comment="省份")
  20. city = db.Column(db.String(255), default="", comment="城市")
  21. area = db.Column(db.String(255), default="", comment="地区")
  22. info = db.relationship('UserProfile', backref='user', uselist=False)
  23.  
  24. @property
  25. def password(self):
  26. return self._password
  27.  
  28. @password.setter
  29. def password(self, rawpwd):
  30. """密码加密"""
  31. self._password = generate_password_hash(rawpwd)
  32.  
  33. def check_password(self, rawpwd):
  34. """验证密码"""
  35. return check_password_hash(self.password, rawpwd)
  36.  
  37. class UserProfile(BaseModel):
  38. """用户详情信息表"""
  39. __tablename__ = "mf_user_profile"
  40. user_id = db.Column(db.Integer,db.ForeignKey('mf_user.id'), comment="用户ID")
  41. education = db.Column(db.Integer, comment="学历教育")
  42. middle_school = db.Column(db.String(255), default="", comment="初中/中专")
  43. high_school = db.Column(db.String(255), default="", comment="高中/高职")
  44. college_school = db.Column(db.String(255), default="", comment="大学/大专")
  45. profession_cate = db.Column(db.String(255), default="", comment="职业类型")
  46. profession_info = db.Column(db.String(255), default="", comment="职业名称")
  47. position = db.Column(db.SmallInteger, default=0, comment="职位/职称")
  48. emotion_status = db.Column(db.SmallInteger, default=0, comment="情感状态")
  49. birthday =db.Column(db.DateTime, default="", comment="生日")
  50. hometown_province = db.Column(db.String(255), default="", comment="家乡省份")
  51. hometown_city = db.Column(db.String(255), default="", comment="家乡城市")
  52. hometown_area = db.Column(db.String(255), default="", comment="家乡地区")
  53. hometown_address = db.Column(db.String(255), default="", comment="家乡地址")
  54. living_province = db.Column(db.String(255), default="", comment="现居住省份")
  55. living_city = db.Column(db.String(255), default="", comment="现居住城市")
  56. living_area = db.Column(db.String(255), default="", comment="现居住地区")
  57. living_address = db.Column(db.String(255), default="", comment="现居住地址")

执行数据库迁移命令

  1. cd ../.. # 切换工作目录会到项目根目录,manage.py所在目录下
  2. python manage.py db init
  3. python manage.py db migrate -m "users table"
  4. python manage.py db upgrade

3.注册功能的实现:手机号码唯一性验证接口

在开发中,针对客户端提交的数据进行验证或提供模型数据转换格式成字典给客户端。可以使用Marshmallow模块来进行。

下面我们来了解一下Marshmallow模块.

2.Marshmallow模块

1.Marshmallow介绍

官方文档:https://marshmallow.readthedocs.io/en/latest/

Marshmallow,中文译作:棉花糖。是一个轻量级的数据格式转换的模块,也叫序列化和反序列化模块,常用于将复杂的orm模型对象与python原生数据类型之间相互转换。marshmallow提供了丰富的api功能。如下:

  1. Serializing

    序列化[可以把数据对象转化为可存储或可传输的数据类型,例如:objects/object->list/dict,dict/list->string]

  2. Deserializing

    反序列化器[把可存储或可传输的数据类型转换成数据对象,例如:list/dict->objects/object,string->dict/list]

  3. Validation

    数据校验,可以在反序列化阶段,针对要转换数据的内容进行类型验证或自定义验证。

Marshmallow本身是一个单独的库,基于我们当前项目使用框架是flask并且数据库ORM框架使用SQLAlchemy,所以我们可以通过安装flask-sqlalchemy和marshmallow-sqlalchemy集成到项目就可以了。

2.基本安装和配置

1.模块安装

  1. pip install -U marshmallow-sqlalchemy
  2. pip install -U flask-sqlalchemy
  3. pip install -U flask-marshmallow

2.模块初始化

  1. import os
  2.  
  3. from flask_marshmallow import Marshmallow
  4. ...
  5. # 数据转换器的对象创建
  6. ma = Marshmallow()
  7.  
  8. def init_app(config_path):
  9. ...
  10. # 数据转换器的初始化
  11. ma.init_app(app)

3.创建一个marsh蓝图模块

为了方便学习和使用Marshllow, 我们单独创建一个蓝图来验证这个模块的基本使用.

  1. cd application/apps
  2. python ../../manage.py blue -n marsh
  1. INSTALLED_APPS = [
  2. "application.apps.home",
  3. "application.apps.users",
  4. "application.apps.marsh",
  5. ]
  1. from application.utils import include
  2. urlpatterns = [
  3. include("","home.urls"),
  4. include("/users","users.urls"),
  5. include("/marsh","marsh.urls"),
  6. ]

3.MarshMallow基本构造器:Schema

marshmallow转换数据格式主要通过构造器类来完成,而Schema类提供了数据转换的基本功能:序列化,验证和反序列化。所以在使用marshmallow的过程中所有的构造器类必须直接或间接继承于Schema基类

1.基于Schema完成数据序列化转换

1.序列化单个数据对象

application/apps/marsh/urls.py

  1. from . import views
  2. from application.utils import path
  3. urlpatterns = [
  4. path("", views.index),
  5. ]

application/apps/marsh/views.py

  1. from marshmallow import Schema,fields
  2. from application.apps.users.models import User,UserProfile
  3. class UserSchema(Schema):
  4. name = fields.String()
  5. age = fields.Integer()
  6. email = fields.Email()
  7. money = fields.Number()
  8. class Meta:
  9. fields = ["name","age","money","email","info"]
  10. ordered = True # 转换成有序字典
  11.  
  12. def index():
  13. """序列化"""
  14. """单个模型数据的序列化处理"""
  15. user1 = User(name="xiaoming", password="123456", age=16, email="333@qq.com", money=31.50)
  16.  
  17. data1 = UserSchema().dump(user1) # 将模型类对象序列化为字典dict格式
  18.  
  19. data2 = UserSchema().dumps(user1) # 把模型对象转换成json字符串格式
  20. return "ok"

2.序列化多个数据对象

在前面进行的序列化操作属于序列化单个数据对象, MarshMallow中也可以进行多个数据对象的序列化.

application/apps/marsh/views.py

  1. from marshmallow import Schema,fields
  2. from application.apps.users.models import User,UserProfile
  3.  
  4. class UserSchema(Schema):
  5. name = fields.String()
  6. age = fields.Integer()
  7. email = fields.Email()
  8. money = fields.Number()
  9. class Meta:
  10. fields = ["name","age","money","email","info"]
  11. ordered = True # 转换成有序字典
  12.  
  13. def index():
  14. """序列化"""
  15. """多个模型数据的序列化"""
  16. user1 = User(name="xiaoming", password="123456", age=15, email="333@qq.com", money=31.50)
  17. user2 = User(name="xiaohong", password="123456", age=16, email="333@qq.com", money=31.50)
  18. user3 = User(name="xiaopang", password="123456", age=17, email="333@qq.com", money=31.50)
  19. data_list = [user1,user2,user3]
  20. data1 = UserSchema(many=True).dumps(data_list) # 注意:序列化多个数据对象要加many=True
  21. return "ok"

3.构造器嵌套使用

application/apps/marsh/views.py

  1. from marshmallow import Schema,fields
  2. from application.apps.users.models import User,UserProfile
  3. class UserProfileSchema(Schema):
  4. education = fields.Integer()
  5. middle_school = fields.String()
  6.  
  7. class UserSchema(Schema):
  8. name = fields.String()
  9. age = fields.Integer()
  10. email = fields.Email()
  11. money = fields.Number()
  12.  
  13. # only的含义是外层序列化器要内层序列化器的哪些字段
  14. info = fields.Nested(UserProfileSchema,only=["middle_school"])
  15. class Meta:
  16. fields = ["name","age","money","email","info"]
  17. ordered = True # 转换成有序字典
  18.  
  19. def index():
  20. """序列化"""
  21. """序列化嵌套使用"""
  22. user1 = User(name="xiaoming", password="123456", age=15, email="333@qq.com", money=31.50)
  23. user1.info = UserProfile(
  24. education=3,
  25. middle_school="北京师范学院附属中学白沙路分校"
  26. )
  27. data = UserSchema().dump(user1)
  28. data = UserSchema().dumps(user1)
  29. print(data)
  30. return "ok"

2.基于Schema完成数据反序列化转换

1.反序列化时设置missing参数

  1. from marshmallow import Schema, fields, validate, ValidationError,post_load
  2. class UserSchema2(Schema):
  3. name = fields.String()
  4. sex = fields.String()
  5. age = fields.Integer(missing=18) # 反序列化数据时,如果数据没有给age字段赋值,则age默认值为18
  6. email = fields.Email()
  7. mobile = fields.String()
  8.  
  9. @post_load
  10. def post_load(self, data, **kwargs):
  11. return User(**data)
  12.  
  13. def index():
  14. user_data = {"mobile":"1331345635","name": "xiaoming", "email": "xiaoming@qq.com","sex":"abc"}
  15. us2 = UserSchema2()
  16. result = us2.load(user_data) # 将字典转化为模型类对象
  17. print(type(result),result) # <class 'application.apps.users.models.User'> <User: xiaoming>
  18. return "ok"

将user_data数据反序列化后再序列化,可以看到结果多了age:18这一项,这就是因为在schema中的age字段中设置了missing=18

2.反序列化转换/忽略部分数据

  1. from marshmallow import Schema, fields, validate, ValidationError,post_load
  2. class UserSchema2(Schema):
  3. name = fields.String()
  4. sex = fields.String()
  5. age = fields.Integer(missing=18)
  6. email = fields.Email()
  7.  
  8. # 设置反序列化时必须要有mobile字段
  9. mobile = fields.String(required=True)
  10.  
  11. @post_load
  12. def post_load(self, data, **kwargs):
  13. return User(**data)
  14.  
  15. def index():
  16. user_data = {"name": "xiaoming","sex":"abc"}
  17. us2 = UserSchema2()
  18.  
  19. # 设置反序列化时可以忽略部分数据
  20. result = us2.load(user_data,partial=True)
  21.  
  22. print(result) # ==> <User xiaoming>
  23. return "ok"

3.设置字段只在序列化或反序列化阶段才启用

  1. from marshmallow import Schema, fields, validate, ValidationError,post_load
  2. class UserSchema2(Schema):
  3. name = fields.String()
  4. sex = fields.Integer()
  5. age = fields.Integer(missing=18)
  6. email = fields.Email()
  7. mobile = fields.String()
  8. password = fields.String(load_only=True) # 设置当前字段为只写字段,只会在反序列化阶段启用
  9.  
  10. @post_load
  11. def post_load(self, data, **kwargs):
  12. return User(**data)
  13.  
  14. def index():
  15. user_data = {"name": "xiaoming","password":"123456","sex":1}
  16. us2 = UserSchema2()
  17. # 反序列化
  18. result = us2.load(user_data)
  19. print(result) # ==> <User xiaoming>
  20. # 序列化
  21. us3 = UserSchema2(only=["sex","name","age"]) # 限制处理的字段,也就是序列化出来只有这三个字段
  22. result2 = us3.dump(result)
  23. print(result2)
  24. return "ok"
  25. '''
  26. class UserSchema(Schema):
  27. name = fields.Str()
  28. # password is
  29. password = fields.Str(load_only=True) # 相当于只写字段 "write-only"
  30. created_time = fields.DateTime(dump_only=True) # 相当于只读字段 "read-only"
  31. '''

4.反序列化阶段的钩子方法

post_dump([fn,pass_many,pass_original]) 注册序列化对象后调用的方法,它会在对象序列化后被调用。

post_load([fn,pass_many,pass_original]) 注册反序列化对象后要调用的方法,它会在验证数据之后被调用。

pre_dump([fn,pass_many]) 注册序列化对象之前调用的方法,它会在序列化对象之前被调用。

pre_load([fn,pass_many]) 在反序列化对象之前,注册要调用的方法,它会在验证数据之前调用。

  1. from marshmallow import Schema, fields, validate, ValidationError,post_load,post_dump
  2. class UserSchema2(Schema):
  3. name = fields.String()
  4. sex = fields.Integer(validate=validate.OneOf([0,1,2]))
  5. age = fields.Integer(missing=18)
  6. email = fields.Email()
  7. mobile = fields.String()
  8. password = fields.String(load_only=True) # 设置当前字段为只写字段,只会在反序列化阶段启用
  9.  
  10. @post_load
  11. def post_load(self, data, **kwargs):
  12. return User(**data)
  13.  
  14. @post_dump
  15. def post_dump(self,data, **kwargs):
  16. data["mobile"] = data["mobile"][:3] +"*****"+ data["mobile"][-3:]
  17. return data
  18.  
  19. def index():
  20. user_data = {"name": "xiaoming","password":"123456","sex":1,"mobile":"133123454656"}
  21. us2 = UserSchema2()

  22. # 反序列化
  23. result = us2.load(user_data)
  24. print(result) # ==> <User xiaoming>

  25. # 序列化
  26. us3 = UserSchema2(only=["sex","name","age","mobile"]) # 限制处理的字段
  27. result2 = us3.dump(result)
  28. print(result2)
  29. return "ok"

Tip:schema常用属性数据类型

类型 描述
fields.Dict(keys, type]] = None, values, …) 字典类型,常用于接收json类型数据
fields.List(cls_or_instance, type], **kwargs) 列表类型,常用于接收数组数据
fields.Tuple(tuple_fields, *args, **kwargs) 元组类型
fields.String(*, default, missing, data_key, …) 字符串类型
fields.UUID(*, default, missing, data_key, …) UUID格式类型的字符串
fields.Number(*, as_string, **kwargs) 数值基本类型
fields.Integer(*, strict, **kwargs) 整型
fields.Decimal(places, rounding, *, allow_nan, …) 数值型
fields.Boolean(*, truthy, falsy, **kwargs) 布尔型
fields.Float(*, allow_nan, as_string, **kwargs) 浮点数类型
fields.DateTime(format, **kwargs) 日期时间类型
fields.Time(format, **kwargs) 时间类型
fields.Date(format, **kwargs) 日期类型
fields.Url(*, relative, schemes, Set[str]]] = None, …) url网址字符串类型
fields.Email(*args, **kwargs) 邮箱字符串类型
fields.IP(*args[, exploded]) IP地址字符串类型
fields.IPv4(*args[, exploded]) IPv4地址字符串类型
fields.IPv6(*args[, exploded]) IPv6地址字符串类型
fields.Method(serialize, deserialize, **kwargs) 基于Schema类方法返回值的字段
fields.Function(serialize, Any], Callable[[Any, …) 基于函数返回值得字段
fields.Nested(nested, type, str, Callable[[], …) 外键类型

Tip:schema数据类型的常用属性

属性名 描述
default 序列化阶段中设置字段的默认值
missing 反序列化阶段中设置字段的默认值
validate 反序列化阶段调用的内置数据验证器或者内置验证集合
required 设置当前字段的必填字段
allow_none 是否允许为空
load_only 是否在反序列化阶段才使用到当前字段
dump_omly 是否在序列化阶段才使用到当前字段
error_messages 字典类型,可以用来替代默认的字段异常提示语,格式:<br>error_messages={“required”: “用户名为必填项。”}

3.反序列化阶段对数据进行校验

1.基于内置器对数据进行校验

内置验证器 描述
validate.Email(*, error) 邮箱验证
validate.Equal(comparable, *, error) 判断值是否相等
validate.Length(min, max, *, equal, error) 值长度/大小验证
validate.OneOf(choices, labels, *, error) 选项验证
validate.Range([min, max]) 范围验证
validate.Regexp(regex, bytes, Pattern][, flags]) 正则验证
validate.URL(*, relative, schemes, Set[str]]] = None, …) 验证是否为URL

Tip:Schema常用属性数据类型

  1. from marshmallow import Schema, fields, validate, ValidationError,post_load
  2. class UserSchema3(Schema):
  3. name = fields.String(required=True)
  4. sex = fields.String(required=True,error_messages={"required":"对不起,permission必须填写"})
  5. age = fields.Integer(missing=18,validate=validate.Range(min=18,max=40,error="年龄必须在18-40之间!")) # 限制数值范围
  6. email = fields.Email(error_messages={"invalid":"对不起,必须填写邮箱格式!"})
  7. mobile = fields.String(required=True, validate=validate.Regexp("^1[3-9]\d{9}$",error="手机号码格式不正确"),error_messages={"Regexp":"手机格式不正确"})
  8.  
  9. @post_load
  10. def make_user_obj(self, data, **kwargs):
  11. return User(**data)
  12.  
  13. def index3():
  14. user_data = {"mobile":"1331345635","name": "xiaoming","age":40, "email": "xiaoming@qq.com","sex":"abc"}
  15. us2 = UserSchema3()
  16. result = us2.load(user_data)
  17. result2 = us2.dumps(result)
  18. print(result)
  19. print(result2)
  20. return "ok"

2.自定义验证方法

局部钩子和全局钩子,比如局部钩子对单个字段(用户名)的判断,以及全局钩子对密码,确认密码多个字段的判断

  1. from marshmallow import Schema, fields, validate,validates, ValidationError,post_load,validates_schema
  2.  
  3. class UserSchema4(Schema):
  4. name = fields.String(required=True)
  5. sex = fields.String(required=True,error_messages={"required":"对不起,permission必须填写"})
  6. age = fields.Integer(missing=18,validate=validate.Range(min=18,max=40,error="年龄必须在18-40之间!")) # 限制数值范围
  7. email = fields.Email(error_messages={"invalid":"对不起,必须填写邮箱格式!"})
  8. mobile = fields.String(required=True, validate=validate.Regexp("^1[3-9]\d{9}$",error="手机号码格式不正确"),error_messages={"Regexp":"手机格式不正确"})
  9. password = fields.String(required=True, load_only=True)
  10. password2 = fields.String(required=True, allow_none=True)
  11.  
  12. @post_load
  13. def make_user_obj(self, data, **kwargs):
  14. return User(**data)
  15.  
  16. # 局部钩子 ***
  17. @validates("name")
  18. def validate_name(self,data,**kwargs):
  19. print("name=%s" % data)
  20. if data == "root":
  21. raise ValidationError({"对不起,root用户是超级用户!您没有权限注册!"})
  22.  
  23. # 必须有返回值
  24. return data
  25.  
  26. # 全局钩子 ***
  27. @validates_schema
  28. def validate(self,data,**kwargs):
  29. print(data)
  30. if data["password"] != data["password2"]:
  31. raise ValidationError("密码和确认密码必须一样!")
  32.  
  33. data.pop("password2")
  34. return data
  35.  
  36. def index():
  37. user_data = {"password":"12345","password2":"123456","mobile":"13313345635","name": "root1","age":40, "email": "xiaoming@qq.com","sex":"abc"}
  38. us2 = UserSchema4()
  39. result = us2.load(user_data)
  40. print(result)
  41. return "ok"

类型
描述
fields.Dict(keys, type]] = None, values, …)
字典类型,常用于接收json类型数据
fields.List(cls_or_instance, type], **kwargs)
列表类型,常用于接收数组数据
fields.Tuple(tuple_fields, *args, **kwargs)
元组类型
fields.String(*, default, missing, data_key, …)
字符串类型
fields.UUID(*, default, missing, data_key, …)
UUID格式类型的字符串
fields.Number(*, as_string, **kwargs)
数值基本类型
fields.Integer(*, strict, **kwargs)
整型
fields.Decimal(places, rounding, *, allow_nan, …)
数值型
fields.Boolean(*, truthy, falsy, **kwargs)
布尔型
fields.Float(*, allow_nan, as_string, **kwargs)
浮点数类型
fields.DateTime(format, **kwargs)
日期时间类型
fields.Time(format, **kwargs)
时间类型
fields.Date(format, **kwargs)
日期类型
fields.Url(*, relative, schemes, Set[str]]] = None, …)
url网址字符串类型
fields.Email(*args, **kwargs)
邮箱字符串类型
fields.IP(*args[, exploded])
IP地址字符串类型
fields.IPv4(*args[, exploded])
IPv4地址字符串类型
fields.IPv6(*args[, exploded])
IPv6地址字符串类型
fields.Method(serialize, deserialize, **kwargs)
基于Schema类方法返回值的字段
fields.Function(serialize, Any], Callable[[Any, …)
基于函数返回值得字段
fields.Nested(nested, type, str, Callable[[], …)
外键类型

day100:MoFang:用户模型类的创建&Marshmallow模块&使用基本构造器Schema完成数据的序列化转换和反序列化转换的更多相关文章

  1. Django商城项目笔记No.3用户部分-用户模型类

    Django商城项目笔记No.3用户部分-用户模型类 Django提供了认证系统,文档资料https://yiyibooks.cn/xx/Django_1.11.6/topics/auth/index ...

  2. 【Python-Django定义用户模型类】Python-Django定义用户模型类详解!!!

    定义用户模型类 1. Django默认用户认证系统 Django自带用户认证系统 它处理用户账号.组.权限以及基于cookie的用户会话. Django认证系统位置 django.contrib.au ...

  3. Django(三) 模型:ORM框架、定义模型类并创建一个对应的数据库、配置Mysql数据库

    一.模型概述 https://docs.djangoproject.com/zh-hans/3.0/intro/tutorial02/ https://www.runoob.com/django/dj ...

  4. django之模型类在视图中的应用

    一:模型类直接从把前端表单传入的值,进行存储. @csrf_exempt def regist(request): if request.method == 'POST': form = UserFo ...

  5. Django 入门案例开发(下)——创建项目应用及模型类

    前面两章是在已经开发好的项目上用来描述环境和业务,这一章创建一个全新的项目来用作开发,你可以跟着我的步骤进行开发,如果有不理解的地方可以给我留言. 今天的任务是创建好项目和用户(users)应用及让它 ...

  6. Django 入门项目案例开发(下)——创建项目应用及模型类

    关注微信公众号:FocusBI 查看更多文章:加QQ群:808774277 获取学习资料和一起探讨问题. 前面两章是在已经开发好的项目上用来描述环境和业务,这一章创建一个全新的项目来用作开发,你可以跟 ...

  7. Ruby on Rails Tutorial 第六章 用户模型

    1.用户模型(1)数据库迁移Rails默认使用关系数据库存储数据,数据库中的表有数据行组成,每一行都有相应的列,对应数据属性.把列名命名为相应的名字后,ActiveRecord会自动把他们识别为用户对 ...

  8. 5 项目---自定义用户模型以及轮播图图片url返回格式

    创建自定义的用户模型类  1. 用命令创建users 应用 2. 将users 注册到settings.py INSTALLED_APPS = [ 'django.contrib.admin', 'd ...

  9. Python实现一个ORM模型类

    ORM是三个单词首字母组合而成,包含了Object(对象-类),Relations(关系),Mapping(映射).解释过字面意思,但ORM的概念仍然模糊.私以为要理解一个事物,最好的法子是搞明白它出 ...

随机推荐

  1. Linux 系统编程 学习:09-线程:线程的创建、回收与取消

    Linux 系统编程 学习:09-线程:线程的创建.回收与取消 背景 我们在此之前完成了 有关进程的学习.从这一讲开始我们学习线程. 完全的开发可以参考:<多线程编程指南> 在Linux ...

  2. eyou升级弹窗、云插件库、接口配置、功能开关【按需显示插件】

    分享一个实用三方插件,如插件描述所言,很多时候我们不希望客户乱搞. hbh.cool/find/146.html

  3. 【Jmeter】设置语言为中文

    1.临时设置 Jmeter菜单栏选择Options-Choose Language-Chinese (Simplified) 这种方法,重启软件后又变为英文环境了. 2.永久设置 进入apache-j ...

  4. pyspark计算最大值、最小值、平均值

    需求:使用pyspark计算相同key的最大值.最小值.平均值 说明: 最大值和最小值好计算,直接reduceByKey后使用python内置的max.min方法 平均值计算提供两种计算方法,直接先上 ...

  5. js——事件循环

    JS-事件循环 js运行的环境称之为宿主环境. 执行栈 :call stack ,一个数据结构,用于存放各种函数的执行环境,每一个函数执行之前他的相关信息会加入到执行栈中,函数调用之前,创建执行环境, ...

  6. linux的mysql数据库创建和删除

    mysql -h localhost -u 用戶名 -p密碼                //连接数据库use desk_show;                                 ...

  7. Oracle初始——第一天

    一.数据库分类 1.小型数据库:access.foxbase 2.中型数据库:informix.sql server.mysql 3.大型数据库:sybase.db2.oracle 二.注释 1./* ...

  8. Java入门(5)

    阅读书目:Java入门经典(第7版) 作者:罗格斯·卡登海德 protected变量只能在其所在的类,该类的子类,以及同一个包里的其他类中使用.包是一组用于完成相同目标的相关类. private变量只 ...

  9. 痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计

    大家好,我是痞子衡,是正经搞技术的痞子.今天给大家带来的是痞子衡的开源项目 RT-UFL. 痞子衡在近两年多的i.MXRT客户项目支持过程中,遇到的一个相当高频的问题就是制作i.MXRT下载算法.我们 ...

  10. react中iconfont字体图标不显示问题

    如下图, 写四个圆圈,直接将iconfont的字体编码写在静态HTML结构中时显示没问题,然而明显这样的结构用循环写是更好的选择, 但是,页面上不能显示字体图片了,而是直接显示字体编码 原因是字体编码 ...