溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Django阿里云部署同步數(shù)據(jù)庫報錯怎么辦

發(fā)布時間:2020-07-27 14:12:09 來源:億速云 閱讀:154 作者:小豬 欄目:開發(fā)技術

小編這次要給大家分享的是Django阿里云部署同步數(shù)據(jù)庫報錯怎么辦,文章內(nèi)容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。

寫在最前面:

在阿里云租了一臺服務器,搭建了一個博客,采用的是Ubuntu+Django+uwsgi+nginx+mysql的結(jié)構(gòu)。

運行了一段時間后,我發(fā)現(xiàn)我忘記了django自帶后臺的密碼!

然后很常規(guī)的修改密碼的操作,就是無法登陸!

然后想再創(chuàng)建一個超級用戶,登上去看看什么情況,結(jié)果創(chuàng)建超級用戶又報錯?

可是本地環(huán)境是ok的,然后同步數(shù)據(jù)庫出錯。。。反正沒有對的。

然后同步數(shù)據(jù)庫報錯如下:

Django阿里云部署同步數(shù)據(jù)庫報錯怎么辦

手機端截的圖,查了一下報錯,應該是setting.py的配置問題,然后我把生產(chǎn)上的代碼拿下來看了下。

如下:

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATICFILES_DIRS = (
 os.path.join(BASE_DIR, 'static'),
 #os.path.join(os.path.dirname(__file__), '../static/').replace('\\', '/'),
)

這里要注意,STATIC_ROOT和STATICFILES_DIRS只要配置一個就可以!

如果非要同時配置

請將

STATIC_ROOT = os.path.join(BASE_DIR, 'static')

改為

STATIC_ROOT = os.path.join(BASE_DIR, '/static/')

然后同步數(shù)據(jù)庫

接下來創(chuàng)建超級用戶也沒有問題了

登錄到admin后臺一看,原來的那個賬號權(quán)限被關了。。。怪不得怎么修改密碼都沒有用。

有空會詳細講講我在阿里云部署Django的過程。

補充知識:django2.0 foreignKey提示on_delete

據(jù)說在django2.0之前創(chuàng)建外鍵foreignKey的參數(shù)on_delete是有默認值的,所以這個參數(shù)可以不用填,但在2.0之后on_delete沒有默認值了,所以這個參數(shù)一定要傳,不然就報以下的錯:

TypeError: __init__() missing 1 required positional argument: on_delete

所以現(xiàn)在就來說一下關于這個on_delete要傳的參數(shù)所代表的含義

on_delete=None, # 刪除關聯(lián)表中的數(shù)據(jù)時,當前表與其關聯(lián)的field的行為

on_delete=models.CASCADE, # 刪除關聯(lián)數(shù)據(jù),與之關聯(lián)也刪除

on_delete=models.DO_NOTHING, # 刪除關聯(lián)數(shù)據(jù),什么也不做

on_delete=models.PROTECT, # 刪除關聯(lián)數(shù)據(jù),引發(fā)錯誤ProtectedError

# models.ForeignKey('關聯(lián)表', on_delete=models.SET_NULL, blank=True, null=True)

on_delete=models.SET_NULL, # 刪除關聯(lián)數(shù)據(jù),與之關聯(lián)的值設置為null(前提FK字段需要設置為可空,一對一同理)

# models.ForeignKey('關聯(lián)表', on_delete=models.SET_DEFAULT, default='默認值')

on_delete=models.SET_DEFAULT, # 刪除關聯(lián)數(shù)據(jù),與之關聯(lián)的值設置為默認值(前提FK字段需要設置默認值,一對一同理)

on_delete=models.SET, # 刪除關聯(lián)數(shù)據(jù),

a. 與之關聯(lián)的值設置為指定值,設置:models.SET(值)

b. 與之關聯(lián)的值設置為可執(zhí)行對象的返回值,設置:models.SET(可執(zhí)行對象)

例,創(chuàng)建一對多外鍵

class UserType(models.Model):
 caption = models.CharField(max_length=32)
 
class UserInfo(models.Model):
 user = models.CharField(max_length=32)
 email = models.EmailField()
 user_type = models.ForeignKey(to="UserType",to_field="id",on_delete=models.CASCADE)

創(chuàng)建外鍵后,直接用models.xxxx.objects.create()創(chuàng)建數(shù)據(jù)時需要注意,外鍵這個值需要傳關聯(lián)表的對象,如下:

class UserType(models.Model):
 caption = models.CharField(max_length=32)
 
class UserInfo(models.Model):
 user = models.CharField(verbose_name='用戶', max_length=32)
 email = models.EmailField()
 user_type = models.ForeignKey(to="UserType",to_field="id",on_delete=models.CASCADE)
-----------上面是的是在models.py,下面的是在views.py-------------
def test(requset):
 ut = models.UserType.objects.filter(id=1).first()
 #print(ut)
 models.UserInfo.objects.create(user='小明',email='abc@163.com',user_type=ut)
 return HttpResponse('ok')

一對多的繼承代碼:

class ForeignKey(ForeignObject):
 def __init__(self, to, on_delete, related_name=None, related_query_name=None,
 limit_choices_to=None, parent_link=False, to_field=None,
 db_constraint=True, **kwargs):
  super().__init__(to, on_delete, from_fields=['self'], to_fields=[to_field], **kwargs)

創(chuàng)建一對一

OneToOneField(ForeignKey)
  to,   # 要進行關聯(lián)的表名
  to_field=None    # 要關聯(lián)的表中的字段名稱
  on_delete=None,    # 當刪除關聯(lián)表中的數(shù)據(jù)時,當前表與其關聯(lián)的行的行為
 
 ###### 對于一對一 ######
 # 1. 一對一其實就是 一對多 + 唯一索引
 # 2.當兩個類之間有繼承關系時,默認會創(chuàng)建一個一對一字段
 # 如下會在A表中額外增加一個c_ptr_id列且唯一:
class C(models.Model):
nid = models.AutoField(primary_key=True)
part = models.CharField(max_length=12)
 
class A(C):
id = models.AutoField(primary_key=True)
code = models.CharField(max_length=1)

一對一的繼承代碼:

class OneToOneField(ForeignKey):
 def __init__(self, to, on_delete, to_field=None, **kwargs):
  kwargs['unique'] = True
  super().__init__(to, on_delete, to_field=to_field, **kwargs)

創(chuàng)建多對多

方式一:自定義關系表

class Host(models.Model):
 nid = models.AutoField(primary_key=True)
 hostname = models.CharField(max_length=32,db_index=True)
 ip = models.GenericIPAddressField(protocol="ipv4",db_index=True)
 port = models.IntegerField()
 b = models.ForeignKey(to="Business", to_field='id')
 # 10
class Application(models.Model):
 name = models.CharField(max_length=32)
 # 2
 
class HostToApp(models.Model):
 hobj = models.ForeignKey(to='Host',to_field='nid')
 aobj = models.ForeignKey(to='Application',to_field='id')
 
 
# HostToApp.objects.create(hobj_id=1,aobj_id=2)這里可以直接對第三張表直接操

方式二:自動創(chuàng)建關系表

class Host(models.Model):
 nid = models.AutoField(primary_key=True)
 hostname = models.CharField(max_length=32,db_index=True)
 ip = models.GenericIPAddressField(protocol="ipv4",db_index=True)
 port = models.IntegerField()
 b = models.ForeignKey(to="Business", to_field='id')
 # 10
class Application(models.Model):
 name = models.CharField(max_length=32)
 r = models.ManyToManyField("Host") --------------> appname_application_r 表名

無法直接對第三張表進行操作

只能間接操作————————————————————

obj = models.Application.objects.get(id=1)
obj.name
 
# 第三張表操作:HostToApp table   基于id=1的Application添加對應關系
obj.r.add(1)增
obj.r.add(2)
obj.r.add(2,3,4)
obj.r.add(*[1,2,3,4])
 
obj.r.remove(1)   刪
obj.r.remove(2,4)
obj.r.remove(*[1,2,3])
 
obj.r.clear() 清除app_id =1 的列
 
obj.r.set([3,5,7])   改set將原來數(shù)據(jù)庫中的關系先全部刪除,在添加1-3,1-5,1-7
——————————————————————————
# 所有相關的主機對象“列表” QuerySet
obj.r.all()   obj.filter() obj.first()

前端取

  {%for app in app_list%}
  <tr>
 <td>{{app.name}}</td>
 <td>{{app.r.all}}</td>
   </tr>
  {%endfor%}

多對多的繼承代碼:

class ManyToManyField(RelatedField):
 def __init__(self, to, related_name=None, related_query_name=None,
 limit_choices_to=None, symmetrical=None, through=None,
 through_fields=None, db_constraint=True, db_table=None,
 swappable=True, **kwargs):
  super().__init__(**kwargs)

看完這篇關于Django阿里云部署同步數(shù)據(jù)庫報錯怎么辦的文章,如果覺得文章內(nèi)容寫得不錯的話,可以把它分享出去給更多人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI