我正在web2py中做一个示例应用。 其中涉及客户,产品和账单,如下所示
db=DAL('sqlite://Navale.db')
db = DAL(lazy_tables=True)
STATE= ('Andaman and Nicobar Islands','Andhra Pradesh','Arunachal Pradesh','Assam','Bihar','Chandigarh',' Chhattisgarh','Dadra and Nagar Haveli','Daman and Diu','Delhi','Goa','Gujrat','Haryana','Himachal Pradesh','Jammu and Kashmir','Jharkhand',' Karnataka','Kerala','Lakshadeep','Madhya Pradesh','Maharashtra','Manipur','Meghalaya','Mizoram','Nagaland','Odisha','Puducherry','Punjab','Rajasthan','Sikkim','Tamil Nadu','Telangana','Tripuru',' Uttar Pradesh','Uttarakhand','West Bengal')
db.define_table('Customer',
Field('Customer_ID', type='id', requires=IS_NOT_EMPTY()),
Field('Customer_Type', requires=IS_IN_SET(['Retail','Local'])),
Field('Name', type='string', requires=IS_NOT_EMPTY()),
Field('Contact_Number', type='integer', requires=IS_NOT_EMPTY()),
Field('Address', type='string'),
Field('City', type='string', requires=IS_NOT_EMPTY()),
Field('State', requires=IS_IN_SET(STATE)),
Field('PIN', type='integer', requires=IS_NOT_EMPTY())
)
db.define_table('Product',
Field('Product_ID', requires=IS_NOT_EMPTY()),
Field('Product_Name'),
Field('Category', requires=IS_IN_SET(['Gents', 'Ladies', 'Kids'])),
Field('Rate', type='double'))
db.define_table ('Bill',
Field('Bill_ID', type='id', requires=IS_NOT_EMPTY()),
Field('Date', type='datetime'),
Field('Customer_ID', db.Customer),
Field('Customer_Name', db.Customer),
Field('Total_cost', type='double'))
当我尝试在'比尔'中添加客户名称时它显示错误
我想生成/打印包含客户详细信息,产品的帐单 信息(如产品名称,产品类型,数量,价格)和 所有产品的总价格。
帮助我。
注意: - 此处Bill包含产品的动态值。这意味着比尔可以拥有1/2/3 /.../ n个产品。
答案 0 :(得分:3)
在web2py中,引用字段存储引用表的主键,它是引用表的整数“id”字段。因此,将“Customer_Name”字段定义为引用字段是没有意义的(可能这样的字段将存储名称,但引用字段存储整数ID)。 “Customer_ID”字段已经是对“客户”表的引用 - 您不需要对“客户”表的其他引用。因此,您只需删除“Customer_Name”字段。
注意,您可以在“客户”表中添加“格式”属性:
db.define_table('Customer', ..., format='%(name)s')
现在,只要您定义引用“Customer”表的字段,例如:
Field('Customer_ID', db.Customer)
参考字段将获得(a)显示客户名称的默认表单窗口小部件(即使关联的“客户”记录ID将插入数据库中),以及(b)显示该客户端名称的默认“表示”属性客户名称而不是只读表单和网格中的客户ID。
如果您需要结合帐单或一组帐单访问客户详细信息,可以通过join进行操作。您还可以利用web2py的内置recursive selects功能。