Skip to main content
 首页 » 编程设计

python之Django 。如何在子模型中存储来自 mixin 的父模型字段

2024年12月31日24telwanggs

请问我的 Django 项目中的模型关系有问题。例如,我有一个模型 Foo 继承自模型混合 FooBarMixin ,它是一个抽象类和 Bar 这是一个模型但有一个 OnetoOne 与 Foo 的关系。基本上这是当前的实现。

class Foo(FooBarMixin): 
        pass 
 
class FooBarMixin(model.Model): 
    bar = model.OneToOneField(Bar, on_delete=CASCADE,              
                     related_name="tracked_%(class)s") 
    class Meta: 
         abstract = True 
 
class Bar(model.Model): 
     pass 

是否可以在不使用 OnetoOne 关系的情况下将 Bar 数据存储在子模型 Foo 上?如果是这样,我该怎么做?谢谢

请您参考如下方法:

Sorry I meant I want the fields in Bar to be visible on the Foo table.

根据您的评论,您因此想要在 Foo 实例中获取 Bar 关系的字段。

我们可以通过修补 __getattr__ 函数来做到这一点:

class Foo(FooBarMixin): 
 
    def __getattr__(self, name): 
        <b>try:</b> 
            return super(Foo, self).__getattr__(name) 
        <b>except AttributeError:</b> 
            <b>return getattr(self.bar, name)</b>

因此,如果属性不能从 Foo 实例本身获取,我们将回退到相应的 self.bar 对象上,并且旨在获取该位置的属性。

设置属性需要以类似的方式覆盖 __setattr__ 函数,尽管我不建议这样做,因为它会引入各种副作用(保存相应的 . bar 对象等)。