【问题标题】:Correctly accessing derived class in OneToOneField relation in Django-Nonrel在 Django-Nonrel 中正确访问 OneToOneField 关系中的派生类
【发布时间】:2012-05-22 18:19:54
【问题描述】:

我正在努力解决这个(希望如此)简单的问题。

我正在使用 Django-nonrel,并且正在尝试设置一些模型。我已经简化了下面的代码:

class Application(models.Model)
    name = "Application"

    def get_name(self):
        print(self.name)

class ExampleApp(Application)
    name = "Example Application"

class Site(models.Model)
    app = models.OneToOneField(Application, null=True)
    id  = models.CharField(max_length=1)
    # other details not important

当我获得Site的实例时,我想获得派生类的实例(例如ExampleApp

class MyView(View):
    def get(self, request, *args, **kwargs):
        # Presuppose that I have an object with id="a"
        site = Site.objects.filter(id="a")

        #<Application: Application>
        app = site.app

        #returns "Application", not "Example Application"
        app.get_name()

如何访问派生类?

(理想情况下,我希望 Application 是一个抽象基类,但 django 不允许与抽象基类的关系。我会在 Application 中定义字段,但 django-nonrel 不支持多- 表继承。)

【问题讨论】:

    标签: django django-models django-nonrel


    【解决方案1】:

    如果没有额外的 Django 插件,这是不可能的。请参阅 Find object in child class from object in parent class in django,其中 lazerscience 的回答建议使用 https://code.google.com/p/django-polymorphic-models/ 访问此功能。

    【讨论】:

    • 这确实 看起来 像我感兴趣的东西。关于这是否适用于 Django-nonrel 的任何想法?
    • 我还没有尝试过,但我想它可以与 djanog-nonrel 一起使用,这只是 NoSQL 的一个实现,这应该与 NoSQL 支持无关。
    • 该解决方案并不完全适用于当前情况。在引用关系时,多态模型似乎没有做任何特别的事情。此外,如果我将基类设为 PolymorphicMetaClass,则在尝试向下转换时会出现错误:Multi-table inheritance is not supported by non-relational DBs.
    【解决方案2】:

    Furbeenator 的回答是正确的,但我觉得我的(自我)回答可能对我这种情况的任何人都更有价值。

    Django-nonrel 包含一些不错的应用程序,特别是 djangotoolboxdjangotoolbox 中包含一个特定字段 EmbeddedModelField。它似乎将模型的副本作为 blob 存储在“容器”模型中。

    在我的例子中:

    from djangotoolbox.fields import EmbeddedModelField
    
    class Site(models.Model)
        app = EmbeddedModelField(null=True)
        id  = models.CharField(max_length=1)
        # other details not important
    

    这样做的好处是,在我的情况下,这也意味着我可以将我的 Application 类抽象化。缺点是数据现在被复制了,我仍然无法从Application 实例访问Site 实例(但在我的情况下,这是一个可以接受的权衡)。

    【讨论】:

      猜你喜欢
      • 2011-10-04
      • 2016-01-17
      • 2014-04-30
      • 2021-08-15
      • 2011-07-14
      • 1970-01-01
      • 2018-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多