【问题标题】:Subclassing Django model only for behavior子类化 Django 模型仅用于行为
【发布时间】:2018-12-19 09:43:36
【问题描述】:

我有一个模型Property,其中包含某些字段和相关方法:

class Property(models.Model):
    table = models.ForeignKey(Table)
    field1 = models.CharField()
    field2 = models.IntegerField()
    field3 = models.BooleanField()

    class Meta:
        abstract = True

    def post():
        pass

但是,从概念上讲,我有一定数量的列类型。字段没有区别,只是某个方法的行为是如何实现的:

class Property1(Property):
    def post():
        # execute behavior for Property1
        pass

class Property2(Property):
    def post():
        # execute behavior for Property2
        pass

等等。

如果我将Property 转换为抽象基模型类并让其余部分继承它,我最终会为每个属性创建不同的表。我不确定我想要那个。所有表格看起来都一样,这是多余的。

但同时在运行查询以获取表中的所有属性并调用post()时,我希望执行相应的行为:

for prop in table.property_set.all():
    prop.post()

我有什么选择?

【问题讨论】:

    标签: django django-1.8


    【解决方案1】:

    为此,您可以使用proxy 模型。试试这样:

    class Property(models.Model):
        table = models.ForeignKey(Table)
        field1 = models.CharField()
        field2 = models.IntegerField()
        field3 = models.BooleanField()
    
    
    class Property1(Property):
        class Meta:
           proxy = True
    
        def post():
            # execute behavior for Property1
            pass
    
    class Property2(Property):
    
        class Meta:
           proxy = True
    
        def post():
            # execute behavior for Property2
            pass
    

    根据文档:

    MyPerson 类在与其父 Person 类相同的数据库表上运行。特别是,任何新的 Person 实例也可以通过 MyPerson 访问,反之亦然:

    所以你可以像这样获取代理实例:

    Property1.objects.filter(pk__in=table.property_set.all())
    

    【讨论】:

    • 缺少我提到的最后一个要求,即返回每个子类的适当实例而不是基类。
    • @dabadaba 请查看我的更新答案。希望对您有所帮助。
    • 这并没有真正的帮助。所做的只是将所有表属性强制转换为给定的子类,无论它是否是该子类的实例。
    • 也许你可以看看这个答案:stackoverflow.com/questions/3891880/…
    猜你喜欢
    • 2016-01-11
    • 2013-07-28
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    • 2013-05-16
    • 1970-01-01
    • 2014-11-01
    相关资源
    最近更新 更多