您好,登錄后才能下訂單哦!
小編這次要給大家分享的是Django阿里云部署同步數據庫報錯怎么辦,文章內容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。
寫在最前面:
在阿里云租了一臺服務器,搭建了一個博客,采用的是Ubuntu+Django+uwsgi+nginx+mysql的結構。
運行了一段時間后,我發現我忘記了django自帶后臺的密碼!
然后很常規的修改密碼的操作,就是無法登陸!
然后想再創建一個超級用戶,登上去看看什么情況,結果創建超級用戶又報錯?
可是本地環境是ok的,然后同步數據庫出錯。。。反正沒有對的。
然后同步數據庫報錯如下:
手機端截的圖,查了一下報錯,應該是setting.py的配置問題,然后我把生產上的代碼拿下來看了下。
如下:
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/')
然后同步數據庫
接下來創建超級用戶也沒有問題了
登錄到admin后臺一看,原來的那個賬號權限被關了。。。怪不得怎么修改密碼都沒有用。
有空會詳細講講我在阿里云部署Django的過程。
補充知識:django2.0 foreignKey提示on_delete
據說在django2.0之前創建外鍵foreignKey的參數on_delete是有默認值的,所以這個參數可以不用填,但在2.0之后on_delete沒有默認值了,所以這個參數一定要傳,不然就報以下的錯:
TypeError: __init__() missing 1 required positional argument: on_delete
所以現在就來說一下關于這個on_delete要傳的參數所代表的含義
on_delete=None, # 刪除關聯表中的數據時,當前表與其關聯的field的行為
on_delete=models.CASCADE, # 刪除關聯數據,與之關聯也刪除
on_delete=models.DO_NOTHING, # 刪除關聯數據,什么也不做
on_delete=models.PROTECT, # 刪除關聯數據,引發錯誤ProtectedError
# models.ForeignKey('關聯表', on_delete=models.SET_NULL, blank=True, null=True)
on_delete=models.SET_NULL, # 刪除關聯數據,與之關聯的值設置為null(前提FK字段需要設置為可空,一對一同理)
# models.ForeignKey('關聯表', on_delete=models.SET_DEFAULT, default='默認值')
on_delete=models.SET_DEFAULT, # 刪除關聯數據,與之關聯的值設置為默認值(前提FK字段需要設置默認值,一對一同理)
on_delete=models.SET, # 刪除關聯數據,
a. 與之關聯的值設置為指定值,設置:models.SET(值)
b. 與之關聯的值設置為可執行對象的返回值,設置:models.SET(可執行對象)
例,創建一對多外鍵
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)
創建外鍵后,直接用models.xxxx.objects.create()創建數據時需要注意,外鍵這個值需要傳關聯表的對象,如下:
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)
創建一對一
OneToOneField(ForeignKey) to, # 要進行關聯的表名 to_field=None # 要關聯的表中的字段名稱 on_delete=None, # 當刪除關聯表中的數據時,當前表與其關聯的行的行為 ###### 對于一對一 ###### # 1. 一對一其實就是 一對多 + 唯一索引 # 2.當兩個類之間有繼承關系時,默認會創建一個一對一字段 # 如下會在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)
創建多對多
方式一:自定義關系表
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)這里可以直接對第三張表直接操
方式二:自動創建關系表
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將原來數據庫中的關系先全部刪除,在添加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阿里云部署同步數據庫報錯怎么辦的文章,如果覺得文章內容寫得不錯的話,可以把它分享出去給更多人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。