将第三方模块合并到Django模型中

时间:2013-05-02 12:44:34

标签: python django django-models model

我正在创建一个产品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),它封装了该实例的相关数据和方法。
  3. 第三方模块具有以下类,每个类包含多个字段和方法:

    • class Id(object)
    • 类Id1(Id)
    • 类Id2(Id)

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

    • def验证
    • def convert
    • def calculate_checksum
    • def cleanse

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

    如何实现这一目标?如果这是不可能的,有什么方法可以解决这个问题?将逻辑委托给视图?

    [编辑] 我忘了添加我想使用模块方法初始化一些字段,如“转换”,“状态”和“错误”。知道怎么做吗?

1 个答案:

答案 0 :(得分: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类中继承的模块中具有所需类的功能。

希望它有所帮助。