我有一些与各种Web API交互的模型。我需要确保每个模型都有一个特定的方法。使用PHP我会创建一个类接口,以确保我的模型具有完成它的工作所必需的方法,但似乎Python接口不适用于Django模型。
我假设这样做的方法是创建一个扩展model.Model的基类,它定义了我需要的方法,如果需要,我可以在每个API模型中覆盖它们。如果没有Django在同步数据库时拿起“基础”类,我怎么能做到这一点?这甚至是正确的方法吗?
答案 0 :(得分:4)
您可以使用abstract = True
类的Meta
方面。
class BaseModelInterface(models.Model):
class Meta:
abstract = True
class ActualModel(BaseModelInterface):
[...normal model code...]
文档:http://docs.djangoproject.com/en/1.3/ref/models/options/
话虽如此,通常鸭子类型被认为是“Python方式”,并且您的调用代码应该测试方法存在(if hasattr(instance, 'method_name')
)。也就是说,你比我们更了解你的特定实现,所以你可以使用abstract = True来获得你想要的行为。 :)
答案 1 :(得分:1)
我认为这更像是一个Python问题。你当然可以看Django abstract base classes,但我建议你做更多的pythonic事情,不要担心尝试强制执行这些类接口。要么你实现了这个方法,要么你没有实现,让调用代码处理它。