django 解決擴(kuò)展自帶User表遇到的問(wèn)題
首先要擴(kuò)展自帶的auth_user表我就放個(gè)圖吧,
同時(shí)setting中應(yīng)該設(shè)置:
# 此處重載是為了使UserProfile生效AUTH_USER_MODEL = 'EcdsApp.UserProfile'
本人的項(xiàng)目需要對(duì)此表進(jìn)行擴(kuò)展,再建兩個(gè)子表關(guān)聯(lián)這個(gè)表,關(guān)聯(lián)關(guān)系為一對(duì)一:
修改完成之后進(jìn)行子表關(guān)聯(lián):
from django.contrib.auth.models import AbstractUser, Userfrom django.conf import settingsclass UserInfo(models.Model): user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
直接關(guān)聯(lián)肯定會(huì)報(bào)錯(cuò),此時(shí)加入上面兩段代碼,
第一個(gè)是引入 setting
第二個(gè)是在關(guān)聯(lián)字段哪里將原有的User 更換為setting.AUTH_USER_MODEL
此時(shí)再次遷移應(yīng)該就能成功了,
能夠遷移成功但是還會(huì)有問(wèn)題。
我后面的功能代碼中原先寫(xiě)的有用到;User這個(gè)表的地方,代碼運(yùn)行到這里就會(huì)出錯(cuò)。
報(bào)錯(cuò)信息如下
AttributeError: Manager isn’t available; ’auth.User’ has been swapped for ’EcdsApp.UserProfile’
原因是原User表已經(jīng)發(fā)生改變這里也需要變動(dòng)一下:
from django.contrib.auth import get_user_modelUser = get_user_model()
直接將這兩行加入到你所有使用到原User表的py文件中,基本問(wèn)題就可以解決!
補(bǔ)充知識(shí):Python+ django + pycharm項(xiàng)目之?dāng)U展默認(rèn)user表
django為我們提供了默認(rèn)的user表,但是在實(shí)際的開(kāi)發(fā)項(xiàng)目的基本是不滿足實(shí)際情況的,所以呢學(xué)習(xí)web知識(shí),擴(kuò)展默認(rèn)user表是必不可少的一部分,雖然很簡(jiǎn)單,但是呢還是在此來(lái)加深下自己的記憶。
在django項(xiàng)目中,所有的數(shù)據(jù)庫(kù)表都是根據(jù)各APP的模型來(lái)生成的,我們創(chuàng)建項(xiàng)目后第一件事就是要去完善user表,這個(gè)利用的知識(shí)點(diǎn)就是Python類的繼承,假如,我要?jiǎng)?chuàng)建UserProfile類來(lái)繼承原來(lái)的AbstractUser類,從而繼承原來(lái)user表的字段,又可以增加自己需要的字段:
在users 用戶app的models.py做如下的修改:
from django.db import models from django.contrib.auth.models import AbstractUser # 引入原來(lái)的Abstract類 # 創(chuàng)建新的類來(lái)繼承原來(lái)的類,并拓展自己的字段class UserProfile(AbstractUser): nick_name = models.CharField(max_length=20, verbose_name=’昵稱’) birthday = models.DateField(verbose_name=’生日’, null=True, blank=True) gender = models.CharField(choices=((’male’, ’男’), (’female’, ’女’)), verbose_name=’性別’, default=’feamale’, max_length=10) address = models.CharField(max_length=50, verbose_name=’地址’, default=’’) mobile = models.CharField(max_length=11, verbose_name=’聯(lián)系電話’, null=True, blank=True) image = models.ImageField(upload_to=’image/%Y/%m’, default=’image/default.png’, max_length=100) class Meta: verbose_name = ’用戶信息’ verbose_name_plural = verbose_name def __str__(self): return self.username
修改了models.py中代碼后,需要注冊(cè)你創(chuàng)建的app,django中是如何來(lái)識(shí)別你創(chuàng)建的APP呢,查看各APP的apps,py文件
文件中的name=‘users’代表著django可以識(shí)別該名稱為這個(gè)APP的名稱,于是就可以在settings.py文件中進(jìn)行注冊(cè)APP了:
還需要配置一個(gè)參數(shù):AUTH_USER_MODEL = ’users.UserProfile’
最后遷移數(shù)據(jù)庫(kù),使用makemigrations 和 migrate 就可以完成user表的擴(kuò)展了,刷新數(shù)據(jù)庫(kù),表是不是已經(jīng)生成了0.0
以上這篇django 解決擴(kuò)展自帶User表遇到的問(wèn)題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. SpringMail使用過(guò)程中的報(bào)錯(cuò)解決辦法2. 程序猿說(shuō)love的100種語(yǔ)言3. 在.NET程序崩潰時(shí)自動(dòng)創(chuàng)建Dump的思路詳解4. Jsp+Servlet實(shí)現(xiàn)文件上傳下載 刪除上傳文件(三)5. 關(guān)于XSL - XSL教程6. 深入淺出JavaScript前端中的設(shè)計(jì)模式7. ASP.NET MVC實(shí)現(xiàn)城市或車(chē)型三級(jí)聯(lián)動(dòng)8. vue+elementUI下拉框回顯問(wèn)題及解決方式9. JSP實(shí)現(xiàn)簡(jiǎn)單網(wǎng)頁(yè)計(jì)算器10. xml文件的結(jié)構(gòu)解讀第1/2頁(yè)
