Dango3:正确设置一对一关系

问题描述

我想一次生成几个相关的模型对象,这些对象通过 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

Django Admin: OneToOne Relation as an Inline?