今天,我将与您分享Django如何使用表格的知识。其中,Django将自动创建一个表。如果您可以解决您现在面临的问题,请不要忘记注意此网站。让我们现在开始!
本文目录清单:
1. django orm创建一个数据表2. Python + Django多表的联合查询方法要寻求建议3.使用Django和MySQL自动构建Tianjiantable 6.如何在Django中实现数据库视图在虚拟表Django中。管理数据库类似于SQLARCHEMY,这也可以通过ORM框架实现。所有数据库的建立均在Model.py中实现。
首先查看如何创建一个表:
A。首先定义类,继承模型。模型,然后根据要求定义参数。这些参数的类型和变量将在以后进一步说明
模型
来自django.db导入模型
类UserInfo(models.model):
用户名= models.charfield(max_length = 32)
密码= models.charfield(max_length = 64)
b。注册应用程序
settings.py
instasted_apps = [[[
‘django.contrib.admin’,
‘django.contrib.auth’,
‘django.contrib.contenttypes',
'django.contrib.sessions',
‘django.contrib.messages',
‘django.contrib.staticfiles’,
“ app01”,
这是给予的
C。execute命令。第一个命令将生成一个初始化文件,第二个命令将生成相应的表
python manage.py makemigrations
python manage.py迁移
这样,PyCharm随附的SQLite数据库中成功生成了App01_userinfo的表。该表将以自我信息为主键,而我们的其他两个字段由我们通过类创建。
d。如果要使用MySQL,因为Django默认使用MySQLDB模块,因此在版本3.0中不存在此错误,因此它将直接报告错误。我们需要更改为PymySQL的模块。该方法如下:
将以下代码添加到同名文件夹的文件夹下的__init__文件:
导入pymysql
pymysql.install_as_mysqldb()
2.查询添加,删除,更改单个表的查询
查询
获取所有结果,获得的结果是类似QuerySet列表的对象。每个元素本身都是一个对象,包括ID,名称,密码和其他属性。
obj = model.userinfo.objects.all()
querySet [UserInfo:UserInfo对象,UserInfo:UserInfo对象,UserInfo:UserInfo对象,UserInfo:UserInfo Object,userInfo:userInfo:userInfo Object]
它可以通过过滤器过滤,这相当于SQL的语句,因为结果也是querySet,因此您需要使用第一个()来获取第一个值
obj = model.userinfo.objects.filter(id = nid).first()
增加
models.userinfo.objects.create(用户名= u,password = p,user_group_id = 3)
删除,您可以根据过滤器删除它
models.userinfo.objects.filter(id = nid).delete()
有两种常见的修改方法
第一条方法
models.userinfo.objects.filter(id = nid).update(用户名= u,password = p)
第二种方式
obj = model.userinfo.objects.filter(id = nid)
obj.username = u
obj.save()
让我们回忆第5章中有关书籍(书)的数据模型:
1
来自django.db导入模型
类出版商(Models.Model):
name = models.charfield(max_length = 30)
地址= model.Charfield(max_length = 50)
city = models.charfield(max_length = 60)
state_provring = model.charfield(max_length = 30)
country = models.charfield(max_length = 50)
网站= models.urlfield()
def __unicode __(self):
返回self.name
班级作者(Models.Model):
first_name = models.charfield(max_length = 30)
last_name = models.charfield(max_length = 40)
电子邮件= models.emailfield()
def __unicode __(self):
返回u'%s%s'%(self.first_name,self.last_name)
课程(Models.Model):
title = models.charfield(max_length = 100)
作者= model.manytomanyfield(作者)
publisher = models.foreignkey(发布者)
publication_date = model.datefield()
def __unicode __(self):
返回self.title
例如,在第5章的解释中,数据库对象的特定字段的值只需要直接使用属性。例如,要确定具有ID的书的标题,我们要这样做:这样做:
来自mysite.books.models导入书籍
b = book.objects.get(id = 50)
B.神经
你的django书'
但是,有一个相关的对象字段,我们没有提及它是外国基金会或Manytomanyfield,它们的影响略有不同。
访问密钥的价值(外键)
当您获得外国键字段时,您将获得相关的数据模型对象。例如:
b = book.objects.get(id = 50)
B.Publisher
出版商:Apress Publishing
b.publisher.website
你''
对于``外国人''
就定义的关系而言,关系的另一端也可以反向追溯,但是由于不对称之间的关系,它略有不同。通过``出版商''的对象,直接
书籍,使用Publisher.book_set.all(),如下:
p = publisher.objects.get(name ='apuse Publishing')
p.book_set.all()
[巴斯:django书,书:潜入蟒蛇,...]
实际上,book_set只是一个QuerySet(请参阅第5章的引入),因此它可以实现数据过滤和除法,例如QuerySet,例如:
1
p = publisher.objects.get(name ='apuse Publishing')
p.book_set.filter(name__icontains ='django')
[书:Django书,书:Pro Django]
属性名称book_set由小写(例如book)和_set组成。
访问多对多价值)
多头键和外部密钥是相同的,但是我们正在处理QuerySet而不是模型实例。例如,如何在此处查看本书的作者:
b = book.objects.get(id = 50)
b.authors.all()
[作者:Adrian Holovaty,作者:Jacob Kaplan-Moss]
b.authors.filter(first_name ='adrian')
[作者:Adrian Holovaty]
b.authors.filter(first_name ='adam')
[]
也可以是反向查询。要查看作者的所有书籍,请使用funer.book_set,AS:
a = rution.objects.get(first_name ='admin',last_name ='holovaty'))
a.book_set.all()
[书:django书,书:阿德里安的另一本书]
在这里,就像使用foreferkey字段一样,属性名称book_set是在数据模型(模型)名称之后添加的。
更改数据库模式(数据库架构)
3
当我们在第5章中介绍SynCDB命令时,我们注意到SynCDB创建了数据库中没有的表。它没有同步数据模型的修改,也没有处理数据模型的删除。如果您添加或修改数据模型中的字段或删除数据模型,则需要在数据库中手动修改它。本段将解释特定的:
在处理模型修改时,重要的是要记住Django数据库层的工作流程。
如果该模型包含在数据库中尚未建立的字段,则Django将报告错误的信息。当您首次使用DJANGO数据库API请求表时会导致错误(也就是说,它将在运行时造成错误,而不是编译))。
3
Django不在乎数据库表中的模型中是否有未定义的列。
Django不在乎数据库中的模型是否尚未表示形式。
1
更改模型的模型体系结构意味着需要按顺序更改Python代码和数据库。
添加字段
1
当您想将字段添加到产品设置表(或模型)时,要使用的技术是使用Django来不关心模型中的列的特征是否不关心。该策略是在该模型中添加字段数据库,然后同步Django模型以包含新字段。
3
但是,这里存在鸡蛋和鸡肉的问题。因为您想知道新添加的SQL语句,所以您需要从中使用Django
查看了manage.py sqlass命令,这需要模型中存在该字段。(注意:您不必使用与Django相同的SQL语句来创建一个新字段,但这确实是一个好主意,这可以使所有内容保持同步。)
3
解决此鸡肉蛋的问题的解决方案是在开发人员环境中而不是发布环境中实现这一变化。(您正在使用测试/开发环境,对吗?)以下是特定的实现步骤。
首先,输入开发环境(即在发行环境中):
将字段添加到您的模型中。
运行manage.py sqlall [yourawp]测试新的创建表语句。请注意新字段的定义。
打开数据库交互式命令接口(例如,PSQL或MySQL,或者您可以使用
manage.py dbshell)。执行Alter表语句以添加新列。
使用python的manage.py shell导入模型并选择表单(例如,例如,
mymodel.objects.all()[:5])验证是否正确添加了新字段。如果一切顺利,所有句子都不会报告错误。
3
然后在您的产品服务器上实现这些步骤。
启动数据库的交互式接口。
5
在开发环境的第三步中执行ALTE表语句。
将新字段添加到模型中。如果您使用控制工具的特定版本,并且在第一步中,您在开发环境中进行了修改。现在,您可以在生产环境中更新代码(例如,如果使用颠覆,请执行SVN执行SVNUPDATE。
重新启动Web服务器,以便修改生效。
让我们练习,例如在第5章中将num_pages字段添加到书籍模型中。首先,我们将在开发环境中将模型更改为以下形式:
课程(Models.Model):
title = models.charfield(max_length = 100)
作者= model.manytomanyfield(作者)
publisher = models.foreignkey(发布者)
publication_date = model.datefield()
?
def __unicode __(self):
返回self.title
在Internet上看到使用Django的模型和MAKEMIGRATION,迁移命令创建新表并使用它。但是我的数据已经存在,并且已经存储了,并且已经存储了数据,并且无法创建新表格。Django的指示和与模型名称的映射关系可以使Django使用现有表。
如果模型在Django中存在如下:
[python]查看普通副本
来自django.db导入模型
#在这里创建您的模型。
Sciencenews(Models.Model):
id = models.charfield(max_length = 36,primary_key = true)
first_module = model.charfield(max_length = 30,默认值=“ news”)
second_module = model.charfield(max_length = 30,默认值=“最新新闻”)
title = models.charfield(max_length = 300)
作者= models.charfield(max_length = 60,null = true)
publish_date = models.charfield(max_length = 35,null = true)
content = model.textfield(null = true)
crawl_date = model.charfield(max_length = 35,null = true)
from_url = models.charfield(max_length = 350,null = true)
执行数据迁移命令:
[python]查看普通副本
python manage.py makemign
python manage.py迁移
名为show_sciencenews的数据表将在数据库中生成。显示为应用程序名称。我的应用程序名称在此处显示。
我的存储和攀登数据数据的表名是Science_News,我想使用它来使用它而不是创建新表。其名称的名称更改为带有表格的模型的名称,在这里我更改为show_sciencenews。然后使用上述数据迁移命令。目前,可以提示数据表数据表已经存在错误。不合理的模型已使用数据表映射。接下来,您只需要正常使用模型和数据表即可。
如果您觉得自己使用自己的ORM来查询。直接获取数据库连接,然后执行SQL语句。
def my_custom_sql():从django.db导入连接,transaction cursor = connect.cursor()#data修改操作-submit requiend cursor.execute.execute(“ update bar set foo = foo = 1 with with white baz raz])trassaction.commit_unless_managed()操作,无需提交cursor.execute(“从bar where where bar =%s”,[self.baz])行= cursor.fetchone()
多-DATA
来自django.db import connectionscursor = connections ['my_db_alias']。光标()#your代码... transaction.commit_unless_managed(use ='my_db_alias')
通常我们不需要手动致电
transaction.commit_unless_maned(
), 我们做得到:
baz =%s“,[value])row = cursor.fetchone()return render_to_response('template.html',{'row':row':row})
提供一个想法。我没有尝试过,我不知道它是否可行。将表的抽象结构定义为模型,但请记住添加
元类:
摘要= true
好吧,您将获得模型的抽象类。当SynCDB时,不会构建抽象类。
然后,编写一个根据日期动态生成动态类的东西。例如,您的抽象称为myModel。
def gen_model_by_date(dt = none):
如果DT没有:
dt = dateTime.dateTime.today()
new_model_name ='mymodel_ {d}'。格式(d = dt.strftime('%y%m%d'))
new_model = type(new_model_name,(mymodel,),{}),{})
返回new_model
然后,在此表的所有逻辑中,此方法用于替换原始模型。
Django代码应由此决定。
一个认真的答案:首先在数据库中建立视图,然后在django中建立相应的模型。类对应于下表的类别,该类别大致如下
类ViewModel(Models.Model):
“”“”此模型类对应于您建立的视图“”“”“”
类元(对象):
“”“以相同的方式,此方法可用于使用MySQL中的任何现有表,而不仅仅是视图“”“”“”。
db_table ='your_view'#差异指定表名称,这是您创建的视图的名称
托管= false#默认值是ture,设置为false django将不会执行表并删除表操作
#创建字段之间的映射
#应该注意,必须将字段设置为主要键
#Thothwise Django将自动创建一个ID字段作为主键,这会导致错误
百度知道它越来越辣,所有答案。
这是Django使用表单和Django自动创建表单的结局。我想知道您是否找到所需的信息?如果您想进一步了解此信息,请记住要收集对该网站的关注。