Django 解决阿里云部署同步数据库报错的问题


Posted in Python onMay 14, 2020

写在最前面:

在阿里云租了一台服务器,搭建了一个博客,采用的是Ubuntu+Django+uwsgi+nginx+mysql的结构。

运行了一段时间后,我发现我忘记了django自带后台的密码!

然后很常规的修改密码的操作,就是无法登陆!

然后想再创建一个超级用户,登上去看看什么情况,结果创建超级用户又报错?

可是本地环境是ok的,然后同步数据库出错。。。反正没有对的。

然后同步数据库报错如下:

Django 解决阿里云部署同步数据库报错的问题

手机端截的图,查了一下报错,应该是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 解决阿里云部署同步数据库报错的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中使用urllib2获取http请求状态码的代码例子
Jul 07 Python
介绍Python中内置的itertools模块
Apr 29 Python
python装饰器与递归算法详解
Feb 18 Python
python中 chr unichr ord函数的实例详解
Aug 06 Python
Python eval的常见错误封装及利用原理详解
Mar 26 Python
python中使用while循环的实例
Aug 05 Python
pytorch中tensor.expand()和tensor.expand_as()函数详解
Dec 27 Python
Pytorch mask_select 函数的用法详解
Feb 18 Python
Python线程threading模块用法详解
Feb 26 Python
python批量替换文件名中的共同字符实例
Mar 05 Python
python中线程和进程有何区别
Jun 17 Python
python 实现关联规则算法Apriori的示例
Sep 30 Python
Python参数传递实现过程及原理详解
May 14 #Python
Django模板标签{% for %}循环,获取制定条数据实例
May 14 #Python
详解python中groupby函数通俗易懂
May 14 #Python
django 解决扩展自带User表遇到的问题
May 14 #Python
解决更改AUTH_USER_MODEL后出现的问题
May 14 #Python
Python基于numpy模块实现回归预测
May 14 #Python
Django之全局使用request.user.username的实例详解
May 14 #Python
You might like
PHP实现采集程序原理和简单示例代码
2007/03/18 PHP
解决PHP在DOS命令行下却无法链接MySQL的技术笔记
2010/12/29 PHP
php中批量修改文件后缀名的函数代码
2011/10/23 PHP
PHP 下载文件时自动添加bom头的方法实例
2014/01/10 PHP
php中使用PHPExcel读写excel(xls)文件的方法
2014/09/15 PHP
详解PHP使用日期时间处理器Carbon人性化显示时间
2017/08/10 PHP
PHP替换Word中变量并导出PDF图片的实现方法
2020/11/26 PHP
js 分栏效果实现代码
2009/08/29 Javascript
让浏览器非阻塞加载javascript的几种方法小结
2011/04/25 Javascript
JavaScript 图像动画的小demo
2012/05/23 Javascript
jQuery$命名冲突怎么办如何解决
2014/01/16 Javascript
jQuery避免$符和其他JS库冲突的方法对比
2014/02/20 Javascript
jQuery中bind(),live(),delegate(),on()绑定事件方法实例详解
2016/01/19 Javascript
Bootstrap每天必学之警告框插件
2016/04/26 Javascript
前端实现文件的断点续传(前端文件提交+后端PHP文件接收)
2016/11/04 Javascript
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
2016/12/15 Javascript
微信小程序 数组中的push与concat的区别
2017/01/05 Javascript
Webpack中雪碧图插件使用详解
2018/05/25 Javascript
JavaScript作用域链实例详解
2019/01/21 Javascript
Python抓取框架Scrapy爬虫入门:页面提取
2017/12/01 Python
spark: RDD与DataFrame之间的相互转换方法
2018/06/07 Python
Anaconda2 5.2.0安装使用图文教程
2018/09/19 Python
详解将Django部署到Centos7全攻略
2018/09/26 Python
10 行Python 代码实现 AI 目标检测技术【推荐】
2019/06/14 Python
Python list与NumPy array 区分详解
2019/11/06 Python
从多个tfrecord文件中无限读取文件的例子
2020/02/17 Python
python轮询机制控制led实例
2020/05/03 Python
Python Excel vlookup函数实现过程解析
2020/06/22 Python
python文件排序的方法总结
2020/09/13 Python
python GUI计算器的实现
2020/10/09 Python
维也纳通行证:Vienna PASS
2019/07/18 全球购物
公司清洁工岗位职责
2015/04/15 职场文书
家庭贫困证明
2015/06/16 职场文书
SQL Server中交叉联接的用法详解
2021/04/22 SQL Server
python析构函数用法及注意事项
2021/06/22 Python
Redis如何实现分布式锁
2021/08/23 Redis