Python 德扬戈。如何将mixin中的父模型字段存储到子模型中?

Python 德扬戈。如何将mixin中的父模型字段存储到子模型中?,python,django,django-models,django-rest-framework,Python,Django,Django Models,Django Rest Framework,请注意,我对Django项目中的模型关系有问题。例如,我有一个模型Foo,它继承了一个模型mixinFooBarMixin,它是一个抽象类,Bar,它是一个模型,但与Foo有OnetoOne关系。基本上这就是当前的实现 class Foo(FooBarMixin): pass class FooBarMixin(model.Model): bar = model.OneToOneField(Bar, on_delete=CASCADE,

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

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
是否可以在子模型
Foo
上存储
Bar
数据而不使用
OnetoOne
关系?如果是这样,我该怎么做?多谢各位


对不起,我的意思是希望
栏中的字段在
Foo
表中可见

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

我们可以通过修补
\uuu getattr\uuu
函数来实现这一点:

class Foo(FooBarMixin):

    def __getattr__(self, name):
        try:
            return super(Foo, self).__getattr__(name)
        except AttributeError:
            return getattr(self.bar, name)
类Foo(FooBarMixin):
def _ugetattr _;(self,name):
尝试:
返回超级(Foo,self)。\uuu getattr\uuuu(名称)
除属性错误外:
返回getattr(self.bar,name)
因此,如果无法从
Foo
实例本身中提取属性,我们将回退到相应的
self.bar
对象,并在该位置获取属性


设置该属性需要以类似的方式重写
\uuuu setattr\uuuuu
函数,尽管我建议不要这样做,因为它会带来各种副作用(保存相应的
.bar
对象等)。

我不明白你在问什么。您的mixin定义了与bar的一对一关系,那么,你怎么能期望在没有关系的情况下存储数据呢?为什么你要指定这个
OneToOneField
?对不起,我的意思是我希望
Bar
中的字段在
Foo
表上可见。@Johnbosco:你可以为它修补
\uu getattr\uu
。@Johnbosco:你可以在任何级别修补它。在
FooBarMixin
,或者在
Foo
,如果您只想要
Foo
s的行为。谢谢@Willem Van Onsem。我想在其他模型上重复使用它。在
FooBarMixin
中有没有一种方法可以做到这一点,同时删除
FooBarMixin
中当前
bar
OnetoOne
关系?您可以在另一个地方(mixin的子类)编写
bar
关系,从而修补mixin本身的
\uu getattr\uuu
。但是,您必须确保以某种方式在子类中实现了
.bar
关系(本身不是指向
bar
实例,而是指向某个实例)。