【问题标题】:How to model this in django (inherited model, where each inherited model has a unique method)如何在 django 中对此进行建模(继承模型,其中每个继承模型都有唯一的方法)
【发布时间】:2011-03-10 19:11:34
【问题描述】:

如何在 django 中建模:

1) 拥有基础制造商网络

2) 在每个网络下,它们可能有多个分销商

3) 系统用户可以通过经销商访问物品

4) 如果用户通过经销商访问该项目,我们希望翻译该项目,每个制造商都有自己的翻译

class Manufacturer(models.Model):
    networkname = models.CharField(max_length=128)

    class Meta:
        proxy = True

class Distributor(models.Model):
    man = models.ForeignKey(Manufacturer)

class ManuType1(Manufacturer):
    def translate(self, str):
        return 'translate'

class ManuType2(Manufacturer):
    def translate(self, str):
        return 'translate'

在这种情况下,我们将收到对某个 Distributor 的请求。我们确定那个分销商,我们想把那个分销商称为制造商翻译方法。 这看起来像是在 django 中建模的一种方法吗(我相信有很多方法可以做到这一点) 所以任何输入/反馈都是有用的。

我遇到问题的地方(可能对 python 不太了解)提供了一个带有 ManuType1 的 Distributor 我如何在运行时调用 translate 函数?

这可能是使用其他术语的一个很好探索的模式,只是不确定如何准确地表达它。

【问题讨论】:

  • 你到底想达到什么目的?您想要 i18n 用于制造商对象中的数据吗?与您尝试执行的操作相比,还有一些其他选项可能更容易。
  • 实际上翻译方法真的无关紧要......它可以是制造商的每个变体中使用的任何方法......

标签: python django inheritance proxy model


【解决方案1】:

如果dist 是 Distributor 的一个实例,那么您可以通过 dist.man 来获取 Manufacturer 实例。由于多表继承在 Django 中的工作方式,您需要访问存在于制造商上的 OneToOneField 到子类实例。问题在于找出存在哪个子类实例。 storing the ContentType of the subclass in the Manufacturer instance 可以使这更容易。

【讨论】:

  • 感谢您的回答,遵循该方法似乎是我基本上正在寻找的,但是如果我希望能够在管理员中添加特定的 ManuType 而不会让我的管理员变得混乱不同的可能制造商?换句话说,我希望我的管理员能够创建一个新的制造商并在他们尝试创建该制造商类型时选择特定实例(ManuType1、ManuType2 ...)。那么当用户创建一个新的分销商时,他们将能够从所有不同的制造商中选择来将分销商与......?
  • 这可以通过自定义 ModelAdmin 和自定义 Form 实例来实现,该实例完成提供适当表单的所有工作,然后创建适当的实例,而不仅仅是一个普通的 Manufacturer 实例。不幸的是,Django 目前不支持在超类实例已经存在后将子类实例添加到超类实例的方法。您必须首先创建子类实例。而且,不幸的是,Django 的管理员在多表继承方面的表现不如其他方面。
  • 再次感谢您的及时回答...您知道如何选择要显示的实例吗?那部分让我有点困惑,我已经看到了自定义表单/管理实例的示例......
猜你喜欢
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多