当前位置: 首页 > 网络应用技术

如何手动构建django(django)

时间:2023-03-07 15:14:40 网络应用技术

  本文的首席执行官注释将介绍Django如何手动构建和Django构建的相关内容。我希望这对每个人都会有所帮助。让我们来看看。

  本文目录清单:

  1. Django如何自动创建数据库表2. Django Orm创建数据表3. Django使用现有数据库表如何构建模型4.我如何使用Django动态定义表单5.构建用户手表(名称,密码)和个人信息表(名称,头像,出生日期等)。6。Django有几种构建桌子的方法。

  Django创建一个数据库表方法如下:

  捕捉器:MySite Catcher $ Python Manage.py Makemigrations Books

  “书籍”的迁移:

  0001_Initial.py:

  - 创建模型作者

  - 创建模型书

  - 创建模型出版商

  -DD Field Publicsher预订

  捕捉器:MySite Catcher $ Python Manage.py Sqlmigrate Books 0001

  开始;

  ------

  - 创建模型作者

  ------

  创建表“ books_author”(“ id”整数而不是null主键自动启动,“ first_name” varchar(30),而不是null,last_name” varchar(40)不是nul null,null,“ emil” varchar(254)不(254)不(254)

  ------

  - 创建模型书

  ------

  创建表“ books_book”(“ id” integer而不是null主键自动启动,标题“ varchar(100)不是null,publication_date”日期而不是null);

  

  ------

  - 创建模型出版商

  ------

  (30)不是零,“乡村” varchar(50)不是null,“网站” varchar(200)而不是null);

  ------

  -DD Field Publicsher预订

  ------

  Alter Table“ Books_book”重命名为“ books_book__old”;

  

  插入“ books_book”(“ publication_date”,“ publisher_id”,“ id”,“ title”)选择“ publication_date”,null,“ id”,“ title” books_book_old”;

  drop表“ books_book__old”;

  在“ books_book”(“ publisher_id”)上创建索引“ books_book_book_2604cbea”;

  犯罪;

  捕捉器:Mysite Catcher $

  

  在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()

  在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。然后使用上述数据迁移命令。目前,可以提示数据表数据表已经存在错误。不合理的模型已使用数据表映射。接下来,您只需要正常使用模型和数据表即可。

  第1节数据结构

  最近的项目开发使用了这样的数据结构:

  主要管理设备。

  在下面,我列出了其简化的结构,没有更多,其余的只是多余的或锦上添花的:

  设备分类的数据结构(相当于设备的大分类):

  [python]查看普通副本

  类别类别(Models.Model):

  name = models.charfield(max_length = 40)

  特定设备的数据结构:

  [python]查看普通副本

  班级设备(型号):

  name = models.charfield(max_length = 100)

  category = model.foreignkey(类别,相关_name=“ cg_equip_list”)

  设备参数的数据结构:

  [python]查看普通副本

  类特征(Model.Model):

  category = model.foreignkey(类别,相关_name=“ eq_characteristics”)

  name = models.charfield(max_length = 40)

  设备参数值的数据结构:

  [python]查看普通副本

  类特征值(Models.Model):

  设备= models.Foreignkey(设备,相关_name=“ eq_characteric_values”))

  特征= model.foreignkey(特征,相关_name=“ eq_key_values”)

  Value = model.Charfield(max_length = 100)

  也许很多人会问:为什么不将设备的参数直接定义为设备的数据结构?

  我的答案是:这可以自己定义更多设备。

  每个设备的参数不同,例如,计算机的参数基本上是:

  CPU频率,内存大小,硬盘大小,显示类型,显示大小等。

  打印机的参数可以是这样:

  最大打印纸表面,打印机的类型等。

  如何将具有不同参数的两个设备保存到数据库中?

  根据上述问题,我们将需要建立两个表格,计算机表和打印机,这些表和打印机包含列中的相应参数。在这种情况下,如果有另一个设备,例如相机,我们将构建更多的数据表,并厌倦了维护数据库。

  但是,根据参数和设备的分离,各种设备的参数以参数表的形式定义。

  将特定设备参数的值放入参数值表中,您可以保存每个设备的参数。

  在参数值的数据表中,哪个设备属于该设备,它主要根据设备的ID和参数的ID确定。

  这样的表结构相对普遍。

  更麻烦的是,当添加设备时,有必要增加其相应的参数值。它的参数不在设备表中,因此必须查询参数表:

  在参数表中,设备分类ID =参数设备的设备分类ID是设备拥有的参数。

  例如:

  设备分类表中的数据:

  ID名称

  1台台式计算机

  2打印机

  参数将以下数据行保存在参数表中:

  ID名称类别

  1 CPU频率1

  2 Mac地址1

  3内存尺寸1

  4显示大小1

  5显示类型1

  6硬盘尺寸1

  7最大印刷表面2

  您可以清楚地看到桌面计算机具有6个参数,并且打印机具有1个参数。

  第2节解决方案部分

  数据结构很清楚。当前问题如何输入这些参数的值?

  困难是每个设备的参数数量不确定。因此,当定义形式时,我们无法修复固定形式的字段数量,只有动态数量增加或减少。字段数。

  那么,如何动态生成不同数量的字段?

  在这里,我的想法是,由于参数的数量存储在数据库中,因此必须查询数据库以动态生成。

  那么,应该使用哪种特定方法来使用Django?

  我自己尝试了很多方法,我慢慢发现了在调试过程中解决此问题的方法。

  这样的过程是这样:

  我开始解决的解决方案包括:

  1.使用Ajax动态生成表单

  2.在管理中使用该方法,使用内联方法,在添加一个设备时添加一些参数

  3.使用表单集制作

  4.使用FormTools中的FormWizard(Form向导)进行制作。

  问题的困境是,参数值表中有2个外部键,因此做得不好。

  我只是在前三种方法中尝试了它,一两天后,我放弃了。主要原因是:

  1.ajax我仍然不是很熟悉。如果您想很好地使用它,则必须转向学习一些相关的JavaScript库。

  2.内联InAdmin针对数据模型,并且增加的参数值相同。例如,可以将其添加到6个CPU参数中。它用于管理员,使用它来使用它非常麻烦。

  3. Formset中的形式还需要相同的数据模型,但是您不能使用具有高键键的参数值表中的表单集,表单集。在简单的数据结构中将表单集输入数据中。

  FormSet具有add_fields的函数。此功能更有用,但是形式没有此功能。简单地理解原理,即形式['field_name'] = forms.charfield()可以为表单实例添加字段。

  我认为FormSet可以解决问题,但前提是,在构造表单集之前,我们必须知道,提前的formset中有几个参数值(也就是说,要知道某个分类设备有几个参数。表单,每种表单都使用不同的参数来初始化初始化)。)。

  在页面中,首先添加设备的形式,因为设备的参数数量尚未固定,并且需要动态增加包含多个参数值表单的表单集,以便可以选择设备的参数。FormSet更适合使用固定个体的形式数量。因此,这增加了使用表单集的困难。如果要使用此方法,您仍然需要使用Ajax动态生成表单集。

  FormSet需要在视图中初始化。

  所以我没有使用这种方式。

  我使用面向桌子的指导方式。

  Django与FormTools的贡献,在使用它之后,使用它将很有用。我学会了一点点使用英语文件。感觉真的很方便。

  但是,在4上方的解决方案的实施过程非常困难。三天后,我有点眉毛。

  第3节具体实施

  Django Univerectioner非常易于使用。

  [python]查看普通副本

  来自django.utils.translation importettext_lazy as _

  从django导入表格

  来自django.forms.formsets导入baseformset

  来自django.forms.fields导入文件

  来自django.forms.util导入验证eRROR

  来自django.shortcuts导入render_to_response

  来自django.contrib.formtools.wizard导入formwizard

  来自ddtcms.office.equipment.models进口设备,特征,特征值

  类设备形式(forms.modelform):

  元类:

  型号=设备

  类特征valueform(forms.form):

  def清洁(自我):

  a = seld.fields

  s = seld.data

  self.clenet_data = {}

  #以下段落从django的Full_Clean中复制

  为了姓名,在self.fields.items()中字段:

  #value_from_datadict()从数据字典中获取数据。

  #每个小部件类型都知道如何返回自己的数据,因为有些

  #小部件将数据划分为SEERAR HTML字段。

  值= field.widget.value_from_datadict(self.data,self.files,self.add_prefix(name))

  尝试:

  如果IsInstance(字段,FileField):

  初始= self.initial.get(name,field.initial)

  value = field.clean(值,初始)

  别的:

  value = field.clean(value)

  self.clenet_data [name] =值

  如果hasattr(self,'clean_%s'%名称):

  value = getttr(self,'clean_%s'%name)()()

  self.clenet_data [name] =值

  除了验证Error,E:

  self._errors [name] = self.error_class(e.messages)

  如果在self.clenet_data中名称:

  del self.clenet_data [名称]

  #cl = self.clenet_data

  #debug()进行调试,检查Cl的值,主要是查看self.clenet_data的值。

  返回self.clenet_data

  类设备CreateWizard(formwizard):

  def完成(self,request,form_list):

  返回render_to_response('设备/DONE.HTML',,

  {{{

  'form_data':[form.clenet_data for form_list],

  })

  def get_form(self,step,data = none):

  “为给定步骤返回表单实例的帮助方法。”

  form = self.form_list [step](data,prefix = self.prefix_for_step(step),初始= self.initial.get(step,none))

  如果步骤== 1:

  如果数据:

  cg = data.get('0类别',1)

  cs = trunication.objects.all()。过滤器(类别__ID = CG)

  对于CS中的C:

  form.fields ['特征 - '+str(c.id)] = forms.charfield(label = c.name)

  g = form.fields

  #debug()

  返回表格

  #从wizard.py复制以更改它。

  def渲染(自我,表单,请求,步骤,上下文=无):

  “渲染给定的形式对象,返回httpresponse。”

  old_data = request.post

  prev_fields = []

  如果old_data:

  hidden = forms.hidendinput()

  #从上述步骤中收集所有数据,并将其作为HTML隐藏归档。

  对于我的范围(步骤):

  old_form = self.get_form(i,old_data)

  hash_name ='hash_%s'%i

  prev_fields.extend([bf.as_hiddddddddddddddddddd()for bf in old_form]))))))))

  prev_fields.append(hidden.render(has_name,old_data.get)

  如果步骤== 1:

  cg = old_data.get('0类别',1)

  cs = trunication.objects.all()。过滤器(类别__ID = CG)

  对于CS中的C:

  form.fields ['特征 - '+str(c.id)] = forms.charfield(label = c.name)

  g = form.fields

  #debug()

  如果步骤== 2:

  debug()

  返回超级(设备CreateWizard,Self)。渲染(表单,请求,步骤,上下文=无)

  def get_template(self,step):

  返回'设备/wizard_%s.html'%步骤

  设备CreateWizard实际上可以放置在Views.py中,我认为这更合理。

  在EquipmentCreateWizard中,我尝试修改Process_Step函数,但没有得到正确的结果。后来,我修改了get_form。我想从django的formtools的wizard.py复制,然后对其进行修改。

  GET_FORM的修改没有得到正确的结果。后来,修改了渲染函数。在步骤2中,我显示了动态参数的数量。没有数据,它是一个空{},

  因此,我再次重新修改了get_form函数,无非是判断它是否是第二步,然后在第二个表单中添加一些字段:

  [python]查看普通副本

  如果步骤== 1:

  cg = old_data.get('0类别',1)

  cs = trunication.objects.all()。过滤器(类别__ID = CG)

  对于CS中的C:

  form.fields ['特征 - '+str(c.id)] = forms.charfield(label = c.name)

  g = form.fields

  #debug()

  此代码可在get_form和渲染中使用。两者都经过判断是否是第二步,然后根据步骤1中选择的设备的分类查询特定分类,然后根据分类获得分类设备。哪个参数,然后修改字段的参数数量根据参数数量。

  “特征 - ”+str(c.id)用于保存将来的数据,拆分字符串,获取参数的ID,并保存特征-1,特征-2 ...中的值桌子。

  g = form.fields

  #debug()

  它用于检查存在多少个参数,无论它是成功修改的。

  类用户(型号。模型):

  用户名= models.charfield(max_length = 50,空白= false)

  密码= models.charfield(max_length = 50,空白= false)

  类UserInfo(models.model):

  user = models.foreignkey(用户)

  地址= models.charfield(max_length = 50,空白= false)

  email = models.charfield(max_length = 50,空白= false)

  通过外键外钥匙议会

  在这样做之前,您需要一个更好的设计框架。如果您想执行自己的应用程序,理论上可以在应用程序中构建表格。最好确保每个应用程序都可以单独使用并且不依赖其他应用程序。由于有两个联系表,因此应独立使用一个称为“常见”的模块,以便每个人都可以打电话。

  结论:以上是介绍Django如何手动构建手表和Django桌子的所有内容的所有内容。我希望这对每个人都会有所帮助。如果您想了解有关此信息的更多信息,请记住收集并关注此网站。