继承:class 方法无法通过使用外键访问

Inheritance: class method not accessible through use of Foreign Key

继承:class 无法通过使用外键访问方法

您好!

问题

我有多个 class 继承自同一个 class。我需要存储在另一个 class(关系)中的这些 classes 的实例之间存在不同的关系。为了能够 link 这些不同的 class 在一起,我使用“母亲” class 它们都继承自作为外键。

一切正常,除了当我通过关系table(外键)访问它们的实例时无法从子classes访问class方法。

当使用“superclass”作为外键时,有什么方法可以访问 subclass 的 class 方法吗?

代码

我的代码如下:

models.py

class SuperClass(models.Model):
    random_attribute = models.CharField()


class A(SuperClass):
    some_attribute = models.CharField()


class B(SuperClass):
    some_other_attribute = models.CharField()
    
    def class_b_method(self):
        some_code = 'goes_here'
        return some_code


class Relationship(models.Model):
    parent = models.ForeignKey(
        'app.SuperClass',
        related_name='parent',
        on_delete=models.CASCADE
    )
    child = models.ForeignKey(
        'app.SuperClass',
        related_name='child',
        on_delete=models.CASCADE
    )

views.py

def do_stuff():
    a = A('a')
    b = B('b')
    relationship = Relationship(parent=a, child=b)
    relationship.child.class_b_method()

这将引发以下错误:

AttributeError at xxx
'SuperClass' object has no attribute 'class_b_method'

我明白错误的原因及其含义,但我不知道如何从关系 table.

访问 class B 方法

如有任何帮助,我们将不胜感激, 谢谢

您将需要访问其 B 模型,您可以通过以下方式执行此操作:

def do_stuff():
    a = A('a')
    b = B('b')
    relationship = Relationship(parent=a, child=b)
    
    relationship.child<strong>.b.</strong>class_b_method()

因此,这将需要额外的查询来获取相关的 B 对象。

虽然非抽象父级支持模型继承。使用它通常不是一个好主意。这是由带有 OneToOneField 到其父项的额外表建模的。因此,这意味着为了找出它是什么子类型,需要查询所有可能的子类。虽然这可以在某种程度上有效地完成,但它仍然会导致相当“繁重”的查询和大量带宽来将子类传递到 Django/Python 层。