继承: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 层。
继承: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 层。