1

我正在创建一个产品 ID 转换应用程序。我有两个模型代表两种 ID 样式:

class Id1(models.Model):
    number = models.CharField(max_length=10)
    converted = models.CharField(max_length=13)
    status = models.CharField(max_length=5) # validation status
    error = models.CharField(max_length=10) # error message

    def __unicode__(self):
        return self.number

class Id2(models.Model):
    number = models.CharField(max_length=13)
    converted = models.CharField(max_length=10)
    status = models.CharField(max_length=5) # validation status
    error = models.CharField(max_length=10) # error message

    def __unicode__(self):
        return self.number

我想将一个第三方 Python(非 Django)模块合并到 Django 模型中,原因有两个:

  1. 它已经提供了我需要的转换功能
  2. 我想在进行转换时使用 OO 方法——我创建了一个类的实例(例如 Id1),它封装了该实例的相关数据和方法。

第三方模块有以下类,每个类都有几个字段和方法:

  • 类 ID(对象)
  • 类 Id1(Id)
  • 类 Id2(Id)

...以及类方法调用的以下顶级函数:

  • 定义验证
  • 定义转换
  • def 计算校验和
  • 定义清洁

但是,我不希望第三方模块的属性在数据库中;每个数据库表应该只包含 Django 模型字段(数字和转换)。

如何做到这一点?如果这是不可能的,有什么替代方法可以解决这个问题?将逻辑委托给视图?

[编辑]我忘了补充一点,我想使用模块方法来初始化一些字段,如“converted”、“status”和“error”。知道怎么做吗?

4

1 回答 1

0

好吧,可能有几种方法:

首先,您可以导入模块并将其相关逻辑封装在模型对象内的自定义方法中,如下所示:

import module
class Id1(models.Model):

    ...

    def custom_validate_method(self):
        # instantiate modules classes needed
        # write the logic needed

然后,您将能够使用任何Id1类实例调用此方法。或者,save()当您尝试像这样持久化对象时,您也可以重写该方法以执行一些额外的逻辑:

    def custom_validate_method(self):
        # instantiate modules classes needed
        # write the logic needed

    def save(self, *args, **kwargs):
        # perform logic (maybe call custom_validate_method)
        return super(Id1, self).save(*args, **kwargs)

您也可以使用多重继承来实现这一点,但请注意,多重继承会带来一些名称冲突。它看起来像这样:

import module
class Id1(models.Model, module.Class):
number = models.CharField(max_length=10)
converted = models.CharField(max_length=13)

def __unicode__(self):
    return self.number

在那里,您在 Id1 类中继承的模块中具有所需的类的功能。

希望能帮助到你。

于 2013-05-02T13:04:15.883 回答