Web2py,我如何使用列表中的内部联接进行选择:参考

时间:2018-11-08 19:06:37

标签: python-3.x web2py

我尝试进行选择,并使用list:reference与表Kits和Estoque进行内部联接,但未返回任何内容,如果我删除了select的联接,但在视图中未显示具有一个产品的多个TR的TR套件,为套件的生产创建一个TR,有人可以帮助我吗?这是我的代码

db.py

db.define_table('TipoUnidade',
                Field('TipoUnidadeDescricao'),
                format='%(TipoUnidadeDescricao)s'
                )

db.define_table('Produto',
                Field('ID_TipoUnidade', 'reference TipoUnidade', requires=IS_IN_SET(['Unidade', 'Gramas'])),
                Field('CodigoBarras', type='integer'),
                Field('CodigoCacauShow', type='integer'),
                Field('CustoUnitario', type='double'),
                Field('QuantidadeMinima', type='double'),
                Field('ProdutoDescricao', type='string', label='Produto'),
                format='%(ProdutoDescricao)s'
                )

db.define_table('EntradaProdutoEstoque',
                Field('ID_Produto', 'reference Produto'),
                Field('Validade', type='date'),
                Field('Data', type='date'),
                Field('Quantidade', type='double'),
                Field('Lote'),
                format='%(Lote)s' + ' - ' + '%(ID_Produto)s'
                )

db.define_table('Estoque',
                Field('ID_Produto', 'reference Produto'),
                Field('Ativo', type='boolean', default=True),
                Field('Validade', type='date'),
                Field('Quantidade', type='double'),
                Field('DataDesativacao',type='date'),
                Field('Lote')
                )



db.define_table('Kits',
                Field('Nome'),
                Field('ID_Estoque', 'list:reference Estoque'),
                Field('QuantidadeProdutos', type='list:integer',label="Quantidade de Produtos"),
                Field('QuantidadeKits', type='integer', label="Quantidade de Kits")
                )

db.define_table('SaidaProdutoEstoque',
                Field('ID_Estoque', 'reference Estoque'),
                #Field('CustoTotal', type='double'),
                Field('Data', type='date'),
                Field('Quantidade', type='double'),
                )

default.py

def kits():


    Kits = db().select(db.Produto.ProdutoDescricao,db.Estoque.Lote, db.Kits.QuantidadeKits, db.Kits.Nome,
                       join=(db.Estoque.on(db.Kits.ID_Estoque == db.Estoque.id),
                             db.Produto.on(db.Estoque.ID_Produto == db.Produto.id)))

    return dict(tabelaKits=Kits)

kits.html

{{for produto in tabelaKits:}}
          <tr>
              <td id="DescProd">{{=produto.Kits.Nome}}</td>
              <td id="DescProd">{{=produto.Produto.ProdutoDescricao}} - {{=produto.Estoque.Lote}}</td>
              <td id="DescProd">{{=produto.QuantidadeKits}}</td>
              <th id="DescCamp"><button>VISUALIZAR</button></th>
          </tr>
      {{pass}}

1 个答案:

答案 0 :(得分:0)

db.Estoque.on(db.Kits.ID_Estoque == db.Estoque.id)

以上,请记住,db.Kits.ID_Estoque存储ID列表,而不是单个ID,因此您不能简单地将其与db.Estoque.id等同。相反,如documentation中所述,您可以将.contains方法与list:类型的字段一起使用:

db.Estoque.on(db.Kits.ID_Estoque.contains(db.Estoque.id))

但是请注意,以上内容并不是有效的查询,因为它会转换为在字符串字段内进行的LIKE搜索。如果遇到性能问题,则可以考虑使用联接表切换到更标准的多对多设计。

相关问题