【问题标题】:Use Selection Field in Another Model in Odoo 13在 Odoo 13 的另一个模型中使用选择字段
【发布时间】:2020-08-21 06:33:31
【问题描述】:

我完全是一个非常喜欢 Odoo 的新手 :)

我在 Odoo CE 13 中被这个问题困扰了几天。

我希望我在 sale.order 中制作的 SHIPPING TYPE 字段可用于 purchase.order 也是。

所以我在 shipping_type.py

中这样做了
  # -*- coding: utf-8 -*-
    from odoo import models, fields
    
    class SaleOrder(models.Model):
        _inherit = 'sale.order'
    
        shipping_selection = [
                    ('type1', 'Instant'),
                    ('type2', 'Same Day'),
                    ('type3', 'JNE'),
                    ('type4', 'Tokopedia'),
                    ('type5', 'Pick Up'),
                    ('type6', 'AnterAja-Reguler'),
                    ('type7', 'J&T-Reguler'),
                    ('type8', 'Ninja-Reguler'),
    
                     ]
    
        shipping_type = fields.Selection(shipping_selection,'Shipping Type',)

然后,我尝试在另一个插件中制作 purchase_shipping_type.py,并创建了这个:

# -*- coding: utf-8 -*-
from odoo import models, fields

class SaleOrder(models.Model):
    _inherit = ['sale.order']

    shipping_selection = [
                ('type1', 'Instant'),
                ('type2', 'Same Day'),
                ('type3', 'JNE'),
                ('type4', 'Tokopedia'),
                ('type5', 'Pick Up'),
                ('type6', 'AnterAja-Reguler'),
                ('type7', 'J&T-Reguler'),
                ('type8', 'Ninja-Reguler'),

                 ]

    shipping_type = fields.Selection(shipping_selection,'Shipping Type',)

class PurchaseOrder(models.Model):
    _inherit = ['purchase.order']

   shipping_type_purchase = fields.Selection(string='Shipping Type',related=shipping_type.shipping_type_purhase, readonly=True)

出现了这个错误:

Aug 21 06:29:03 kama-odoo-server odoo13[24202]: NameError: name 'shipping_type' is not defined - - -

如何正确设置?我真的希望有人可以帮助我:) 谢谢!

【问题讨论】:

  • 嗨,@fransiskus Felix,您需要在 python 文件中将 shipping_selection 设为全局变量。

标签: python odoo


【解决方案1】:

相关属性用于指定字段名的序列。

通过遵循一系列关系字段并读取到达模型上的字段来给出相关字段的值。要遍历的字段的完整序列由相关属性指定。

使用Selction 字段时,selection 属性是强制性的,relatedextended 字段除外。

您可以在account模型中找到相关的选择字段,声明如下:

user_type_id = fields.Many2one('account.account.type', ...)
internal_type = fields.Selection(related='user_type_id.type', ...)

您还可以在帐户合作伙伴中找到一个选择字段,该字段使用在基础 res_partner 模型中声明的 constant list

from odoo.addons.base.models.res_partner import WARNING_MESSAGE, WARNING_HELP

invoice_warn = fields.Selection(WARNING_MESSAGE, 'Invoice', help=WARNING_HELP, default="no-message")

要在SaleOrder类中保留shipping_selection的声明,你需要删除related属性并修改shipping_type_purchase字段如下:

shipping_type_purchase = fields.Selection(shipping_selection, ...)

如果SaleOrder 类没有在同一个模块中声明,你只需像上面的例子一样导入它。

您可以将shipping_selection 标记为常量列表,然后修改shipping_type_purchase 字段:

SHIPPING_SELECTION = [
        ('type1', 'Instant'),
        ('type2', 'Same Day'),
        ('type3', 'JNE'),
        ('type4', 'Tokopedia'),
        ('type5', 'Pick Up'),
        ('type6', 'AnterAja-Reguler'),
        ('type7', 'J&T-Reguler'),
        ('type8', 'Ninja-Reguler'),

    ]

class SaleOrder(models.Model):

    shipping_type = fields.Selection(SHIPPING_SELECTION, ...)


class PurchaseOrder(models.Model):
    
    shipping_type_purchase = fields.Selection(SHIPPING_SELECTION, ...)

【讨论】:

  • 这个答案对你有帮助吗?
  • 您好 Kenly,对于迟到的回复,我深表歉意。这个看起来不错。不知何故,我的团队改变了它的工作方式。但是,我们很快就会有类似的案例,一定会尝试并让您知道。非常感谢!
【解决方案2】:

PurchaseOrder 中的shipping_type 替换为SaleOrder.shipping_type 就可以了。

原因是shipping_type 被定义为类的一部分,应该这样引用

[编辑]:在这种特殊情况下,尽管您的模型之间存在关系,但应该使用 one2many 或 many2one 字段来处理(请参阅here

【讨论】:

  • 嗨 qmeeus,谢谢你的回答 :) 我按照你的建议试过了: class PurchaseOrder(models.Model): _inherit = ['purchase.order'] shipping_type_purchase = fields.Selection(string= 'Shipping Type', related=SaleOrder.shipping_type.shipping_type_purchase, readonly=True) 它给了我这个错误:RecursionError: maximum recursion depth exceeded while calling a Python object - - -
  • 我的错,你必须建立关系模型。我不是 Odoo 的专家,但我在答案中添加了一个链接,可以为您指明正确的方向
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-28
  • 2021-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多