Django - 扩展父类和只更改子类字段名的 pythonic 方式?



我正在研究一些与网络相关的模型混合,我有两个特定的模型,除了它们的字段名前缀之外,它们应该在各个方面都是相同的。

图片:

class SrcEvent(models.Model):
src_ip = models.GenericIPField...
(...many more properties and methods...)
class DstEvent(models.Model):
dst_ip = models.GenericIPField...
(...many more properties and methods...)

重复所有内容两次(甚至只是扩展一个以获得另一个方法(对我来说并不合适;我最终想要的是一个通用的抽象类Event,它只包含iphostname等属性,然后用两个子类(SrcEventDstEvent(进行扩展,当模型生成/迁移时,它们将"src_"或"dst_"附加到每个字段。

我不能只是做Event然后把它称为一天;有些模型混合了一组、另一组或两组属性,方向很重要。这些模型是混合的。它们混合到的模型可以具有与源事件(如警报(、目标事件(如电子邮件(或同时与源事件和目标事件(netflow(相关的属性。因此,例如,Netflow(SrcMixin, DstMixin)模型将同时具有src_*dst_*字段集,如果两个mixin都调用各自的IP地址字段ip,则不起作用。这就是为什么我需要保持这种区别。

我不知道如何在 Django 中解决这个问题,或者如何称呼它来自己查找它。任何提示将不胜感激!

我不确定其中的"mixin"方面,但这听起来像是使用抽象基类的情况。

要定义抽象基类,您可以使用如下内容:

class Event(models.Model):
class Meta:
abstract = True
#define all your common fields here

在ORM中,源和目标将成为单独的表。正如我所说,我不确定"mixin"方面,但对于第一个近似值,我认为使源和目标抽象也可能有效,以便实例化源或目标的对象需要填充所有字段?

我正在使用表单集来解决这个问题。我保留了这些字段的通用性,但我添加了一个新的 CharField 来指示方向("src"或"dst"(。然后,我根据提交的表单数量及其方向创建对象和对事件的引用。

最新更新