Python 德扬戈。如何将mixin中的父模型字段存储到子模型中?
请注意,我对Django项目中的模型关系有问题。例如,我有一个模型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,
Foo
,它继承了一个模型mixinFooBarMixin
,它是一个抽象类,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
实例,而是指向某个实例)。