大家好!是的,我又发“伪”教程了,本来这篇文章原名为《Django 数据库表操作总结:基于Django1.11.1》,但是我改了,因为Django把该做的都做了,我们根本不用考虑和数据库本身打什么交道,我之前更新网站时(对,就是那个很丑的主题 ),考虑过将某些字段删除,并将某些字段属性修改,为此我查询了很多教程,他们的教程应该是太老了,导致我按照步骤一步一步操作,最后得到的结果全是报错!
真是一步一个坑的教训,直到近日和好友“太阳是我焐热的”讨论这个问题,自己重新做了一遍操作,准备复现当时的报错给他时,结果我发现只要在Django项目中的models.py中修改一处,同步一次,就不会出现任何问题,并且完美的解决我们的需求,所以,我们需要的只是一个正确的操作步骤。
先考虑自己的需求,我需要在一个已经部署好运行了很久的服务器上删除所有数据的同一个字段,并且修改某个表中某个字段的属性,最后新增加一个ManyToManyField字段。
看完需求,我们看如何具体地实现它,
我的代码段(截取片段):
# 文章表
class Post(models.Model):
title = models.CharField(max_length=70, verbose_name=u'标题')
excerpt = models.CharField(max_length=100, verbose_name=u'摘要')
imgurl = models.CharField(max_length=200, verbose_name=u'封面图')
body = models.TextField(verbose_name=u'内容')
category = models.ForeignKey(Category, verbose_name=u'所属分类')
plate = models.ForeignKey(Plate, verbose_name=u'所属板块')
love_num = models.IntegerField(default=0, verbose_name=u'喜爱次数')
browse_num = models.IntegerField(default=0, verbose_name=u'浏览次数')
created_time = models.DateTimeField(verbose_name=u'创建时间')
modified_time = models.DateTimeField(verbose_name=u'最后修改时间')
现在我想要删除plate这个字段,按照网上的教程,我们需要去数据库将该字段删除,然后删除表,但其实不用这么麻烦,只需要将下面这一行代码移除即可,
plate = models.ForeignKey(Plate, verbose_name=u'所属板块')
然后在终端中进入manage.py同级目录输入同步命令:
python manage.py makemigrations
python manage.py migrate
进行到这一步,我还要修改某个表中某个字段的属性:
class Links(models.Model):
title = models.CharField(max_length=30, verbose_name=u'网站名称')
url = models.CharField(max_length=20, verbose_name=u'网站主页')
created_time = models.DateTimeField(verbose_name=u'创建时间')
class Meta:
verbose_name = '友情链接'
verbose_name_plural = verbose_name
def __str__(self):
return self.title
由于我最开始设计表的时候没考虑到有些网站主页字段多的情况,导致后面我加友情链接时出现字符大小限制,所以我需要修改这个字段,传统的办法:
先在models.py文件中修改字段属性,不要同步,然后进入Mysql的命令行,直接修改字段属性:
alter table 表名 modify 列名 属性;
比如我之前的:
url = models.CharField(max_length=20, verbose_name=u'网站主页')
我要改成
url = models.CharField(max_length=70, verbose_name=u'网站主页')
命令就是:
alter table monitor_links modify turl varchar(70);
其实根本不用那么麻烦,只需要直接修改字段属性,同步即可。
最后一个要求:新增加一个ManyToManyField字段。
做法是:先增加一个Class,和之前建立表的操作无差别,然后必须同步数据库,让它把表建立起来:
# 多对多
class Tags(models.Model):
name = models.CharField(max_length=100)
再在文章表里增加该字段:
# 文章表
class Post(models.Model):
title = models.CharField(max_length=70, verbose_name=u'标题')
excerpt = models.CharField(max_length=100, verbose_name=u'摘要')
imgurl = models.CharField(max_length=200, verbose_name=u'封面图')
body = models.TextField(verbose_name=u'内容')
category = models.ForeignKey(Category, verbose_name=u'所属分类')
# plate = models.ForeignKey(Plate, verbose_name=u'所属板块')
love_num = models.IntegerField(default=0, verbose_name=u'喜爱次数')
browse_num = models.IntegerField(default=0, verbose_name=u'浏览次数')
created_time = models.DateTimeField(verbose_name=u'创建时间')
modified_time = models.DateTimeField(verbose_name=u'最后修改时间')
# 新增加字段
tags = models.ManyToManyField(Tags, null=True, blank=True, default='')
最后同步完成!这些关于数据库的操作应该都是你需要的,下次再见了。
网友评论