gpt4 book ai didi

Django 外键打破多表继承

转载 作者:行者123 更新时间:2023-12-01 06:46:17 25 4
gpt4 key购买 nike

以下代码按我的预期工作:

class General(Model):
pass

class Captain(Model):
general = ForeignKey('General',related_name='captains')

我可以创建一个将军,添加船长,并按预期执行“general.captains”。

但是,当这两个类都继承自可能具有额外信息的基类时,灾难就会发生。
class Officer(Model):
pass

class General(Officer):
pass

class Captain(Officer):
general = ForeignKey('General',related_name='captains')


>>> g = General()
>>> g.captains
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "C:\Python27\lib\site-packages\django\db\models\fields\related.py", line
391, in __get__
self.related.model._default_manager.__class__)
File "C:\Python27\lib\site-packages\django\db\models\fields\related.py", line
469, in create_manager
getattr(instance, attname)}
File "C:\Python27\lib\site-packages\django\db\models\fields\related.py", line
301, in __get__
raise self.field.rel.to.DoesNotExist
DoesNotExist

知道这里可能发生什么,我该如何解决?

最佳答案

如果您定义 Officer,它应该可以工作模型明确为 abstract

class Meta:
abstract = True

因此,作为测试,我稍微修改了您的基类:
class Officer(models.Model):
name = models.CharField(max_length=255)
class Meta:
abstract = True

以下工作:
>>> General(name='Warfield').save()
>>> G = General.objects.all()[0]
>>> Captain(name='Picard', general=G).save()
>>> C = Captain.objects.all()[0]
>>> C.general.name
u'Warfield'
>>> G.captains.all()[0].name
u'Picard'

关于Django 外键打破多表继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4981909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com