web2py:多个表:条件插入/更新/删除:来自一个表单

时间:2011-06-02 12:31:20

标签: python web2py

我编写了用于管理条件插入/更新/删除的代码 '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' )

来自FORM的

,数据将填入以下两个表


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'中的字段

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

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


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

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


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

如果从FORM字段返回的值为空,则

删除,否则更新


        if len(warlist)>0:

else insert


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

同样,管理表'mdlextwr'

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

查看'mdlmst'表


        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) 

PL。告诉我,如果我在这里编写任何愚蠢的东西。 我非常欢迎任何有关改进的想法/建议。

谢谢, 维尼特

1 个答案:

答案 0 :(得分:2)

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

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

你在'mdlmst'和'wrmst'表之间建立了多对多的关系,并在'mdlmst'和'extwrmst'之间建立了多对多的关系。虽然这不一定是错的,但这让我感到非常不可能,这就是你想要的。

我的感觉是你的数据库设计需要工作。在开始设计表单之前,应该对此进行整理。