【问题标题】:web2py: multiple tables: conditional insert/update/delete: from one formweb2py:多个表:有条件的插入/更新/删除:从一种形式
【发布时间】:2011-09-07 01:21:56
【问题描述】:

我已经编写了用于管理条件插入/更新/删除的代码 'web2py' 中单个表单的多个表。 我同意,代码是非常原始的形式,可能不是“pythonic”。 有代码重复。 但至少我有一些事情要做并建立一个精致的 结构体。


型号:


db.define_table('mdlmst', 
              Field('mdlmstid','id'), 
              Field('mdlmstcd'), 
              Field('mdlmstnm'), 
              migrate=False, 
              format='%(mdlmstnm)s' 
              ) 

db.define_table('wrmst', Field('wrmstid','id'), Field('wrmstcd'), Field('wrmstnm'), migrate=False, format='%(wrmstnm)s' )

db.define_table('extwrmst', Field('extwrmstid','id'), Field('extwrmstcd'), Field('extwrmstnm'), migrate=False, format='%(extwrmstnm)s' )

从表格中,数据将填充到以下两个表中


db.define_table('mdlwr', 
              Field('mdlwrid','id'), 
              Field('mdlmstid',db.mdlmst), 
              Field('wrmstid',db.wrmst), 
              migrate=False 
              ) 

db.define_table('mdlextwr', Field('mdlextwrid','id'), Field('mdlmstid',db.mdlmst), Field('extwrmstid',db.extwrmst), migrate=False )

控制器:

‘modelwar’控制器将渲染‘mdlmst’表中的记录


def modelwar(): 
    models = db(db.mdlmst.mdlmstid>0).select(orderby=db.mdlmst.mdlmstnm) 
    return dict(models=models) 

点击特定记录后,“war_edit”控制器会

管理表格 - ‘mdlwr’ & ‘mdlextwr’


def war_edit(): 
    mdl_id = request.args(0)

mdl_id 是标识“mdlmstid”(要修改的记录)的变量

 
    mdl_nm = request.args(1)

mdl_nm 是获取‘mdlmstnm’的变量

 
    warset = db(db.mdlwr.mdlmstid==mdl_id)        # fetch a set 
    extwarset = db(db.mdlextwr.mdlmstid==mdl_id)  # fetch a set 
    warlist = db(db.mdlwr.mdlmstid==mdl_id).select() # get a ROW object 
    extwarlist = db(db.mdlextwr.mdlmstid==mdl_id).select() # get a ROW object

form_war=FORM(TABLE(TR("Basic Warranty", 

SELECT(_type="select",_name="baswar",*[OPTION(x.wrmstnm,_value=x.wrmstid) fo­r x in db().select(db.wrmst.ALL)]), TR("Extended Warranty", SELECT(_type="select",_name="extwar",*[OPTION(x.extwrmstnm,_value=x.extwrms­­tid) for x in db().select(db.extwrmst.ALL)]), TR("", INPUT(_type='submit',_value='Save')), ))))

预填充‘form_war’中的字段


    if len(warlist)>0: 
        form_war.vars.baswar = warlist[0].wrmstid 
    if len(extwarlist)>0: 
        form_war.vars.extwar = extwarlist[0].extwrmstid 

表单提交成功后,管理表'mdlwr'


    if form_war.accepts(request.vars, session): 

如果列表中有任何记录从数据库中提取并发送到 FORM,


        if len(warlist)>0:

如果FORM字段返回值为空则删除,否则更新


            if form_war.vars.baswar==''
                warset.delete() 
            else: 
                warset.update(wrmstid=form_war.vars.baswar)

其他插入

 
        else: 
            db.mdlwr.insert(mdlmstid=mdl_id, wrmstid=form_war.vars.baswar)

同样,管理表'mdlextwr'


        if len(extwarlist)>0: 
            if form_war.vars.extwar=='': 
                extwarset.delete() 
            else: 
                extwarset.update(extwrmstid=form_war.vars.extwar) 
        else: 
            db.mdlextwr.insert(mdlmstid=mdl_id, extwrmstid=form_war.vars.extwar) 

    response.flash = 'Warranty definition saved' 
return dict(form_war=form_war,mdlnm=mdl_nm) 

查看“mdlmst”表


{{response.files.append(URL(r=request,c='static',f='jquery.dataTables.min.j­­ 
s'))}} 
{{response.files.append(URL(r=request,c='static',f='demo_table.css'))}} 
{{extend 'layout.html'}} 

jQuery(document).ready(function() 
{   jQuery('.smarttable').dataTable();}); 

Modelwise Warranty Master

Model IDModel CodeModel Name {{for model in models:}} {{=model.mdlmstid}} {{=model.mdlmstcd}} {{=model.mdlmstnm}} {{=A('edit warranty',_href=URL('war_edit',args=[model.mdlmstid,model.mdlmstnm]))}} {{pass}}

PL。告诉我我是否在这里编写了任何愚蠢的代码。 我非常欢迎任何改进的想法/建议。

谢谢, 维内特

【问题讨论】:

  • 问题是什么?你有错误或异常吗?我不太清楚你的目标是什么。
  • 我的意图是:i)从一个表单管理多个表,ii)用户可以添加/编辑/删除不同表的条目。 (即添加/编辑/删除的组合)。因此,不可能通过 CRUD 或 SQLFORM.factory 对逻辑进行硬编码。所以我需要确定发送到 FORM 的值并从 FORM 中返回值。根据该逻辑,我可以确定是否对每个表使用插入/更新/删除。 iii) 我在这方面没有任何错误。我要求我的朋友在这里查明任何愚蠢的逻辑/任何其他方法/改进等。
  • 好的,我没有技术知识可以回答你,但恕我直言,这个问题没有太多机会被回答。请查看FAQ。一般来说,问题越具体,得到好的答案的机会就越大。

标签: python web2py


【解决方案1】:

你的数据库设计对我来说很奇怪。

在每个表中都有一个“id”类型的字段。这将替换 web2py 自动生成的 id 字段 - 一个坏主意。来自 web2py 的书:“不要声明一个名为“id”的字段,因为无论如何都是由 web2py 创建的。每个表默认都有一个名为“id”的字段。它是一个自增整数字段(从1) 用于交叉引用并使每条记录唯一,因此“id”是主键”

您在表“mdlmst”和“wrmst”之间创建了多对多关系,并在“mdlmst”和“extwrmst”之间创建了另一个多对多关系。虽然这不一定是错误的,但我觉得这极不可能是你想要的。

我的感觉是您的数据库设计需要工作。这应该在你开始设计表单之前解决。

【讨论】:

  • 注意,默认情况下,web2py 会为每个表创建一个 'id' 字段。但是,虽然不推荐,但您可以显式创建一个 type='id' 的字段,web2py 将使用该字段作为自增 id 字段,而不是为您创建一个 'id' 字段。见web2py.com/book/default/chapter/06?search=named+id+field
  • @Anthony 我不知道。好像有点没用为什么要使用这样的功能?书中说:“除非访问遗留数据库表,否则不建议这样做。”
  • 我同意 - 没有理由使用命名的 id 字段,除非您需要访问已经具有命名自动增量字段的旧数据库,您需要将其用作 id 字段。
  • @Anthony, @ravenspoint:我正在使用“MySQL”数据库。表已在那里定义。我只是在 DAL 中抽象它们。
  • @Trufa,具体来说,我的问题是:pl。看FORM提交后的代码。它用于识别是否需要删除语句,或者需要更新或插入(基于用户交互)。代码工作没有错误。但这可能违反了 DRY 原则。因为对于每个其他 FORM,我都需要编写类似的代码。如果我必须对代码进行任何改进,我需要在很多地方重复它。 (Q.)有什么建议/改进可以分享!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多