设计USER APP的model
User moedl 是比较重要的model,当框架所提供的model不能满足你的需求的时候,需要更改或者扩展user model. 扩展django user的方法有几种,这里介绍2种:
- 继承AbstractUser
- 继承AbstractBaseUser
继承AbstractUser
继承AbstractUser ,可以在框架原有的提供的用户表基础上扩展字段。
#model.py
from django.db import models
from django.contrib.auth.models import AbstractUser
class UserProfile(AbstractUser):
nick_name = models.CharField(max_length=50, verbose_name=u"昵称", default="")
birday = models.DateField(verbose_name=u"生日", null=True, blank=True)
gender = models.CharField(max_length=6, choices=(("male",u"男"),("female","女")), default="female")
address = models.CharField(max_length=100, default=u"")
mobile = models.CharField(max_length=11, null=True, blank=True)
image = models.ImageField(upload_to="image/%Y/%m",default=u"image/default.png", max_length=100)
class Meta:
verbose_name = "用户信息"
verbose_name_plural = verbose_name
def __unicode__(self):
return self.username
setting 里加入语句 AUTH_USER_MODEL = 'myapp.modelclass'
AUTH_USER_MODEL="users.UserProfile"
记得在 app 的 admin.py 中注册这个模式(为了使管理员界面中显示这个数据类型),xadmin可以自行百度。
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User
admin.site.register(User, UserAdmin)
继承 AbstractBaseUser 类
在 app 的 models 里面可以写入自定义的 USER字段,(上面2步setting和admin设置也是一样需要的)
#model.py
class MyUser(AbstractBaseUser):
#保证至少有一个字段是 unique=True的
identifier = models.CharField(max_length=40, unique=True)
...
USERNAME_FIELD = 'identifier'
#这里的 USERNAME_FIELD 字段是用作认证的,需要声明给 Django 知道,方便认证。
model设计是项目比较重要的一步,有一些需要注意的地方:
1、避免model间循环引用
2、分层设计:将model的操作(比如评论,收藏等)独立出来建立operation的独立的app