【问题标题】:Django. How to store parent model fields from mixin in child model?姜戈。如何将来自mixin的父模型字段存储在子模型中?
【发布时间】:2018-07-10 08:12:48
【问题描述】:

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

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 上?如果是这样,我该怎么做?谢谢

【问题讨论】:

  • 我不明白你在问什么。你的 mixin 定义了与 bar 的一对一关系,那么你怎么能期望在没有关系的情况下存储数据呢?
  • 那你为什么要指定这个OneToOneField呢?
  • 抱歉,我希望Bar 中的字段在Foo 表中可见。
  • @Johnbosco:您可以为此修补__getattr__
  • @Johnbosco:你可以在你想要的任何级别上修补它。在FooBarMixinFoo,如果您只希望Foos 的这种行为。

标签: python django django-models django-rest-framework


【解决方案1】:

抱歉,我的意思是我希望 Bar 中的字段在 Foo 表中可见。

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

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

class Foo(FooBarMixin):

    def __getattr__(self, name):
        try:
            return super(Foo, self).__getattr__(name)
        except AttributeError:
            return getattr(self.bar, name)

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

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

【讨论】:

  • 谢谢@Willem Van Onsem。我想在其他模型上重用它。有没有办法在FooBarMixin 中做到这一点,同时还删除bar 目前在FooBarMixin 中的OnetoOne 关系?
  • 好吧,您可以在另一个地方(mixin 的子类)编写bar 关系,从而修补mixin 本身的__getattr__。但是你必须确保你以某种方式在子类中实现.bar 关系(不是本身指向Bar 实例,而是指向某个实例)。
猜你喜欢
  • 2020-08-16
  • 2011-05-15
  • 1970-01-01
  • 2021-05-20
  • 2016-11-19
  • 2022-12-11
  • 2016-06-09
  • 2018-07-03
相关资源
最近更新 更多