User模型扩展和自定义

Posted yitianyouyitian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了User模型扩展和自定义相关的知识,希望对你有一定的参考价值。

参考如下:

django文档参考

django signal使用总结

django 信号注册

django信号问题1

django oneTooneFiled

 

 
 

1. django 自定义用户user模型的三种方法

 

1.1 创建基于User 的proxy model,就是使用代理模型

1.2 使用abstractuser扩充fields

试验过,但是总是有报错,应该是哪里设置的问题。

复制代码 代码如下:

profiles/models.py

from django.db import models
from django.contrib.auth.models import AbstractUser
from django.utils.translation import ugettext_lazy as _

# Create your models here.
class KarmaUser(AbstractUser):
karma = models.PositiveIntegerField(_("karma"),default=0,blank=True)
settings.py

AUTH_USER_MODEL = ‘profiles.KarmaUser‘

  

1.3.使用一对一关系将相关的模型一个个联系起来,扩充原来的User模型

这很像django 1.5之前的方式.很适用于创建第三方扩充包的场景,松耦合,不会破坏之前项目的结构.

需要此方法的场景:
- 在自己的django prj下,希望有多重user拥有各自很不相同的字段.或许希望有些用户组合起来一些用户的类型字段,并且希望能在模型层面上解决这些问题.
例子如下:

profiles/models.py

复制代码 代码如下:

from django.conf import settings
from django.db import models

from flavors.models import Flavor

class EaterProfile(models.Model):
# 默认用户资料
user = models.OneToOneField(settings.AUTH_USER_MODEL)
favorite_ice_cream = models.ForeignKey(Flavor,null=True,blank=True)

class ScooperProfile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL)
scoops_scooped = models.IntegerField(default=0)

class InventorProfile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL)
flavors_invented = models.ManyToManyField(Flavor,null=True,blank=True)

 

1.4.继承abstractbaseuser来替代原来的User模型

只有当你对usermodel里面的默认字段不满的时候才要使用,这个方法只保留了passwork,last_login,is_active三个字段。

参考官方文档:
https://docs.djangoproject.com/en/1.7/topics/auth/customizing/

 

 

个人认为在我的建站场景中,第二种最合适.正在测试是否可以用抽象类简化模型.待续...

以上3种方法各有优劣,大家根据自己的需求,自由选择吧。

 

2.  OneToOneFiled的具体实现记录

1. 需求: 为了防止暴力破解,要求玩家连续登录5次错误之后帐号锁定10分钟(10分钟后自动解除锁定)。管理员可以手动解除锁定。

2. 做好的登录app目录如下:

 

技术分享图片

 

3. 设计数据库 loginapp/models.py如下:

#-*- encoding:utf-8 -*-

from django.contrib.auth.models import AbstractUser
from django.contrib.auth.models import User
from django.db import models
import datetime
import django.utils.timezone as timezone

class Userotherstatus(models.Model):
    user=models.OneToOneField(User,on_delete=models.CASCADE)
    is_freezed=models.BooleanField(default=False,help_text=u"帐号是否被冻结")
    freezed_time=models.DateTimeField(null=True,blank=True,help_text=u"帐号冻结的时间点")
    pass_errnum=models.IntegerField(default=0,help_text=u"密码已经错误次数")

注意:通过 python manage.py migrate将models应用导数据库后,创建用户过后,User模型一对一的Userotherstatus模型对应的数据库表里面没有数据。

解决办法使用 django signal。当我们创建和更新用户实例时,Userotherstatus模块也会被自动创建和更新。

4. signal 实现如下:

参考: https://blog.csdn.net/qq_32506555/article/details/53219036

loginapp/signals.py

#-*- encoding: utf-8 -*-

from django.db.models.signals import post_save
from django.contrib.auth.models import User
from .models import Userotherstatus
from django.dispatch import receiver

@receiver(post_save, sender=User)
def creat_user_otherstatus(sender,instance,created,**kwargs):
    print "use signal creat"
    if created:
        Userotherstatus.objects.create(user=instance)


@receiver(post_save, sender=User)
def save_user_otherstatus(sender, instance, **kwargs):
    print (" use signal save")
    instance.userotherstatus.save()


#

signal 信号注册:

loginapp/apps.py

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.apps import AppConfig


class LoginappConfig(AppConfig):
    name = ‘loginapp‘

    def ready(self):
        import loginapp.signals

 

loginapp/__init__.py

default_app_config = ‘loginapp.apps.LoginappConfig‘

 

以上是关于User模型扩展和自定义的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security 自定义 UserDetailsS​​ervice 和自定义 User 类

在 Django 中使用自定义字段扩展用户模型

猿创征文|时间序列分析算法之平稳时间序列预测算法和自回归模型(AR)详解+Python代码实现

扩展 Sonata 用户包和自定义操作

扩展Django内置的auth模块代码示例

扩展 IdentityUser 和自定义查询的 Web API