问题描述
我想一次生成几个相关的模型对象,这些对象通过 stacked.Inline
链接到模型视图中。我可以在管理视图中创建对象。但是,当我转到管道模型的列表视图时,我得到:
'Pipeline' 对象没有属性 'args'
我与其他模型的设置几乎相同,所以我不确定为什么在这种情况下它不起作用。它抱怨“管道”没有参数
model.py:
class Pipeline(models.Model):
config= models.OnetoOneField('Config',on_delete=models.SET_NULL,null=True,parent_link=True)
class Config(models.Model):
args = models.CharField(max_length=256,default='-p -q -x -u -l -m -r')
pipeline = models.OnetoOneField('Pipeline',on_delete=models.CASCADE,parent_link=False)
admin.py:
class ConfigInline(admin.StackedInline):
model = Config
class PipelineAdmin(admin.ModelAdmin):
inlines = [ConfigInline]
我进行了数据库迁移。
解决方法
您在一对一字段中设置了 parent_link=True
。根据{{3}}:
当 True 并在从另一个具体继承的模型中使用时 模型,表示该字段应用作返回到的链接 父类,而不是额外的 OneToOneField 通常通过子类化隐式创建。
您显然不会在对另一个模型进行子类化时使用它(这称为多表继承),因此这是没有意义的。将您的实施更改为:
class Pipeline(models.Model):
config= models.OneToOneField('Config',on_delete=models.SET_NULL,null=True)
class Config(models.Model):
args = models.CharField(max_length=256,null=True,default='-p -q -x -u -l -m -r')
pipeline = models.OneToOneField('Pipeline',on_delete=models.CASCADE,null=True)
此外,它仍然没有意义,因为这样您基本上在两个表中都有一个外键,我认为这不是您想要的,只将关系保持在一个模型中(外键更适合的表)在根据你):
class Pipeline(models.Model):
pass
class Config(models.Model):
args = models.CharField(max_length=256,null=True)
# from config to get pipeline:
# related_pipeline = config.pipeline
# from pipeline to get config (Django will automatically add this related accessor):
# config = pipeline.config
,
根据与 Abdul 的对话,OneToOne 字段只能与模型继承一起使用。以下工作,但它不受官方支持。我发现文档在这方面有些模棱两可。所以,认为这是一个黑客:
class Pipeline(models.Model):
pipeline = models.OneToOneField(
'Pipeline',null=True )
class Config(models.Model):
args = models.CharField(
max_length=256,default='-p -q -x -u -l -m -r' )
pipeline = models.OneToOneField(
'Pipeline',parent_link=True )
因此,缺少使用父链接。否则,在管理面板中,无法同时创建两个模型。
根据此:“指定父链接字段如前所述,Django 将自动创建一个 OneToOneField 将您的子类链接回任何非抽象父模型。如果您想控制链接回父类的属性的名称,您可以创建自己的 OneToOneField 并设置 parent_link=True 以指示您的字段是返回父类的链接。”来自
https://docs.djangoproject.com/en/dev/topics/db/models/#specifying-the-parent-link-field