以上就是给各位分享南迁移期间如何在Django模型类上调用静态方法,其中也会对django迁移进行解释,同时本文还将给你拓展03-Django模型类、django–从南迁移历史中删除迁移、django
以上就是给各位分享南迁移期间如何在Django模型类上调用静态方法,其中也会对django 迁移进行解释,同时本文还将给你拓展03-Django模型类、django – 从南迁移历史中删除迁移、django模型类、java – 在类上调用静态方法?等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:南迁移期间如何在Django模型类上调用静态方法(django 迁移)
我正在南部进行数据迁移,以修复我在早期代码中搞砸的一些非规范化数据。找出错误字段的正确值的方法是在Django模型类上调用静态方法。代码如下:
class Account(models.Model): name = models.CharField() @staticmethod def lookup_by_name(name): # There''s actually more to it than this return Account.objects.get(name=name)class Record(models.Model): account_name = models.CharField() acct = models.ForeignKey(''Account'')
…
class Migration(DataMigration): def forwards(self, orm): # Fixing Records with the wrong FK to Account for record in orm.Record.objects.all(): record.acct = orm.Account.lookup_by_name(record.account_name) record.save()
但这失败了
AttributeError: type object ''Account'' has no attribute ''lookup_by_name''
我猜南方@staticmethod
在模型类上不支持s吗?
尝试直接导入Account失败,除非我也直接导入Record并完全忽略ORM对象。这是一个安全的选择,因为它是数据迁移并且架构没有更改?还是我应该手动运行此修复程序,而不是在向南迁移的情况下。
答案1
小编典典在向南迁移中,不能使用来自models.py的方法。原因是在将来,models.py将会发展,您迟早会删除这些方法,然后迁移就会中断。
您应该将迁移所需的所有代码放入迁移文件本身。
03-Django模型类
ORM框架:对象-关系-映射
将面向对象语言程序中的对象自动持久化到关系数据库中。本质就是将数据从一种形式转换到另外一种形式
O表示Object 对象类
R表示Relations 关系,关系数据库中的表
M表示Mapping 映射,它的作用就是建立O和R之间的联系
通过类和对象操作数据库表,不需要写sql语句
在Django中已经内置了ORM框架,这个框架将类和数据表进行对应起来,只需通过类和对象就可以对数据表进行操作,也可以通过设计的模型类生成数据库中的表
模型类
1. 设计模型类
from django.db import models
# Create your models here.
class BookInfo ( models.Modeles ): """ 图书模型类 1.图书名称,CharField 说明是一个字符串,max_length字符串的最大长度,与数据库表对应 2.出版日期,DateField是一个日期类型 数据里表里还有一个主键id,id在Django里会自动生成,不需要定义 """ btitle = models.CharField ( max_length=20 ) bpub_date = models.DateField ()
2、根据模型类生成表
-
生成迁移文件,迁移文件是根据模型类生成的, 使用命令 python manage.py makemigrations
-
执行迁移文件生成表,使用命令 python manage.py migrate
Django项目默认使用的数据库是sqlite3,可以在settings里看到,在项目下会生成一个db.sqlite3,如何打开?
1)安装
sudo apt-get install sqliteman
2)输入命令sqliteman 回车就会打开 3)File--open,选择db.sqlite3文件打开
根据模型类生成的表,表名是应用名_模型类名小写
3、根据模型类操作数据库表的增删改查
进入项目的shell环境
命令:python manage.py shell
- 向表里插入数据
from booktest.models import BooKInfo # 应用名 类名
b=BookInfo() # 定义一个BookInfo类对象
b.btitle=''红楼梦'' # 定义b对象的属性并赋值
from datetime import date
b.bpub_date = date(1990,1,1) # 定义出版日期
b.save()
- 查表里的数据
b2=BookInfo.objects.get(id=1)
type(b2)
b2.btitle # 回车显示 红楼梦
- 更新数据库表
b2.bpub_date=date(1990,10,10)
b2.save()
- 删除数据
b2.delete()
4、模型类关系和关系查询
(多表之间有关联)
# 人物类
# 人物名 hname
# 性别 hgender # 年龄 hage # 关系属性 hbook 建立图书类与人物类之间的一对多的关系 的属性 class HeroInfo(models.Models): hname=models.CharField(max_length=20) # default 指定默认值,False代表男 hgender=models.BooleanFiled(defalut=False) hbook=models.ForeignKey(''BookInfo'') # 建立两表之间的关联
-->生成迁移文件-->根据迁移文件生成表,hbook在生成的表后,表里的字段对应为hbook_id,固定格式:关系属性名_id
-->插入数据
from booktest.models import BooKInfo,HeroInfo b = BookInfo()
b.btitle=''红楼梦''
from datetime import date
b.bpub_date = date(1990,1,1)
b.save()
h = HeroInfo()
h.hname=''林黛玉''
h.hgender=True
h.hbook_id = b # 指定book表里的主键id
h.save() h2=HeroInfo() # 在增加一条数据
h2.hname=''贾宝玉''
h2.hbook=b
h2.save()
django – 从南迁移历史中删除迁移
我后来发现0.9有一个我不想要的功能,并降级到0.8
过了一段时间,我尝试在我的项目上进行南迁移并遇到错误
south.exceptions.NoMigrations:来自’/home/ubuntu/virtualenvs/codingqna/local/lib/python2.7/site-packages/robots/__init__.pyc’\u0026gt;’的应用程序’< module''robots''没有迁移. 我猜0.9有迁移文件,但0.8没有,南方抱怨它. 如何从南方的历史中删除它,就像它从未存在过一样? (就像我从头开始使用0.8而没有迁移文件) 或者我可以在这里使用的任何其他方式?
解决方法
delete from south_migrationhistory where app_name=''robots'';
south_migrationhistory表只记录已应用的迁移和尚未应用的内容.由于0.8的机器人没有任何迁移文件,因此可以删除表south_migrationhistory中的任何条目,它不会影响任何其他内容.
django模型类
模型类
ORM
django中内嵌了ORM框架,ORM框架可以将类和数据表进行对应起来,只需要通过类和对象就可以对数据表进行操作。
在Django中主要是设计类:模型类。
ORM另外一个作用:根据设计的类生成数据库中的表。
模型类设计
在应用models.py中设计模型类。
必须继承与models.Model类。
1) 设计BookInfo类。
2) 设计HeroInfo类。
Models.ForeignKey可以建立两个模型类之间一对多的关系,django在生成表的时候,就会在多端的表中创建一列作为外键,建立两个表之间一对多的关系。
模型类生成表
1) 生成迁移文件
命令:python manage.py makemigrations
迁移文件是根据模型类生成的。
2) 执行迁移生成表
命令:python mange.py migrate
根据迁移文件生成表。
生成表名的默认格式:
应用名_模型类名小写
通过模型类操作数据表
进入项目shell的命令:
python manage.py shell
以下为在相互shell终端中演示的例子:
首先导入模型类:
from booktest.models import BookInfo,HeroInfo
1) 向booktest_bookinfo表中插入一条数据。
b = BookInfo() #定义一个BookInfo类的对象
b.btitle =‘天龙八部‘ #定义b对象的属性并赋值
b.bpub_date = date(1990,10,11)
b.save() #才会将数据保存进数据库
2) 查询出booktest_bookinfo表中id为1的数据。
b = BookInfo.objects.get(id=1)
3) 在上一步的基础上改变b对应图书的出版日期。
b.bpub_date = date(1989,21)
b.save() #才会更新表格中的数据
4) 紧接上一步,删除b对应的图书的数据。
b.delete() #才会删除
5) 向booktest_heroInfo表中插入一条数据。
h = HeroInfo()
h.hname = ‘郭靖‘
h.hgender = False
h.hcomment = ‘降龙十八掌’
b2 = BookInfo.objects.get(id=2)
h.hbook = b2 #给关系属性赋值,英雄对象所属的图书对象
h.save()
6) 查询图书表里面的所有内容。
BookInfo.objects.all()
HeroInfo.objects.all()
关联操作
1) 查询出id为2的图书中所有英雄人物的信息。
b = BookInfo.objects.get(id=2)
b.heroinfo_set.all() #查询出b图书中所有英雄人物的信息
java – 在类上调用静态方法?
编辑:好的,我搞砸了
interface Int{ void someMethod(); } class ImplOne implements Int{ public void someMethod() { // do something } } Class<? extends Int> getInt(){ return ImplOne.class; }
在这种情况下,someMethod()不能是静态的.
解决方法
所以如果你使用:
SomeClass.someStaticmethod()
你没有实例化(离开类加载和实例化SomeClass类本身,这是JVM处理的,并且超出了你的范围).
这与已经被实例化的对象上调用的常规方法相反:
SomeObject o = someObject; // had to be instantiated *somewhere* o.someMethod();
关于南迁移期间如何在Django模型类上调用静态方法和django 迁移的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于03-Django模型类、django – 从南迁移历史中删除迁移、django模型类、java – 在类上调用静态方法?的相关信息,请在本站寻找。
本文标签: