162.扩展User模型-使用Proxy模型

扩展用户模型:

Django内置的User模型虽然已经足够强大了,但是有时候还是不能满足我们的需求,比如在验证用户登录的时候,它用的是用户名作为验证,而我们有时候需要通过手机号码或者是邮箱进行验证,还有比如我们想要增加一些字段,那么这时候我们就需要扩展用户模型了,扩展用户模型有多种方式。

1.设置Proxy模型(设置代理的形式):

如果你对Django中提供的字段,已经验证方式都比较满意,最主要的就是不需要添加任何的字段,只是需要在原有的基础上增加一些操作的方法,那么建议使用这种方式,这种方式操作起来非常简单,并且可以通过代理的形式来为原有的模型定义一些方法、属性等,但是不能再原有字段的基础上定义其他的字段。models.py文件示例代码如下:
from django.db import models
from django.contrib.auth.models import User


class Person(User):
    class Meta:
    <!--设置proxy=True,标记该模型不用映射到数据库中,只是一个代理-->
        proxy = True

    <!--定义一个类方法,cls就是当前的类对象,即user-->
    @classmethod
    def get_blacklist(cls):
        return cls.objects.filter(is_active=False)
在views.py文件中,应用User代理模型定义的方法get_blacklist()获取所有的is_active为False的用户。
from .models import Person
from django.http import HttpResponse
from django.contrib.auth.models import User
from django.shortcuts import render


def index(request):
    users = Person.get_blacklist()
    if users:
        print(type(users))
        for user in users:
            print(user.username)
        context = {
            'users': users
        }
        return render(request, 'proxy.html',context=context)
    else:
        context = {
            'users': '没有查找到诶!'
        }
        return render(request, 'proxy.html', context=context)
在proxy.html中接收视图函数中的上下文。
<ul>
    {% for user in users %}
        <li>未激活的账号:{{ user.username }}</li>
    {% endfor %}

</ul>

在浏览器中,就会显示当前数据库中is_active为False的用户。

在以上示例中,我们定义了一个Person类,继承自User,并且在Meta中设置了proxy=True,说明这个只是User的一个代理模型。它并不会影响原来User模型在数据库中的表的结构。以后如果你想方便的获取所有黑名单的人(账号不能使用的用户),那么就可以通过Person.get_blacklist()就可以获取到,并且User.objects.all()和Person.objects.all()是相同的,因为他们都是从User这个模型中获取所有的数据。
posted @ 2020-02-22 23:52  一笑而过~一笑奈何  阅读(169)  评论(0编辑  收藏  举报