2013-05-02 51 views
1

我正在创建产品ID转换应用程序。我有两个型号表示两个ID风格:将第三方模块合并到Django模型中

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. 我想在转换中使用面向对象的方法 - 我创建了一个封装了该实例的相关数据和方法的类的实例(例如Id1)。

第三方模块具有若干字段,并且每个方法以下类:

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

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

  • 高清验证
  • 高清转换
  • 高清calculate_checksum
  • 高清洁净

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

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

[编辑]我忘了补充一点,我想使用模块方法来初始化一些字段,如“转换”,“状态”和“错误”。任何想法如何做到这一点?

+0

这是不是很清楚你在这里问什么。你想使用现有的代码来进行转换/计算吗?那么你为什么不从模型的方法中调用这些函数等呢? – UloPe 2013-05-02 12:53:59

+0

你说得对。我忘了提及一个关键方面:我想将方法​​返回值保存为模型字段。所以自定义的save()方法将包含模块中的代码,例如将Id1转换为Id2并将结果保存在“已转换”字段中。验证和转换异常会影响其他两个字段“状态”和“错误”。所有这些都在对象初始化或保存时自动发生。可能? – geeljire 2013-05-03 00:02:47

回答

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类中继承的模块中需要的类的功能。

希望它有帮助。

+0

谢谢。我尝试了多重继承,但它抱怨'__init__'需要2个参数,我给它1.当我给它2(包含一个虚拟字符串)时,它说我给了它3而不是2。有助于理解您可以使用导入模块的模型中的自定义方法。但是,我想将这些方法的返回值也保存在模型字段中。那可能吗?例如,在用一个数字初始化Id1对象并保存它时,我想将它自动转换为Id2并将其另存为第二个字段“转换”。非常感谢Paulo。很好的帮助! – geeljire 2013-05-02 23:56:40

+0

没问题,我很高兴你能解决它。当然,您可以将返回值分配给字段。如果你想从类内做到这一点:'self.number' = 3,然后当你做self.save()时,它会将3保存到数据库中。对于一个方法是一样的:'self.number = custom_method()'。关于'__init__'参数。有了多重继承,你应该重载'__init__',然后在ovrrided'__init__'中调用每个超类的'__init__'来避免这些问题。 – 2013-05-03 01:04:35