Python Dango3:正确设置OneTONE关系

Python Dango3:正确设置OneTONE关系,python,django,django-3,Python,Django,Django 3,我想一次生成几个相关的模型对象,这些对象通过stacked.Inline在模型视图中链接。我可以在管理视图中创建对象。但是,当我转到管道模型的列表视图时,我得到: “Pipeline”对象没有属性“args” 我有几乎相同的设置与其他型号的工作,所以我不知道为什么它在这种情况下不工作。它抱怨“管道”没有参数 model.py: class Pipeline(models.Model): config= models.OneToOneField('Config', on_delete=mo

我想一次生成几个相关的模型对象,这些对象通过
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, null=True, default='-p -q -x -u -l -m -r')        
    pipeline = models.OneToOneField('Pipeline', on_delete=models.CASCADE, null=True, parent_link=False)
class ConfigInline(admin.StackedInline):
    model = Config


class PipelineAdmin(admin.ModelAdmin):
    inlines = [ConfigInline]
admin.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, null=True, default='-p -q -x -u -l -m -r')        
    pipeline = models.OneToOneField('Pipeline', on_delete=models.CASCADE, null=True, parent_link=False)
class ConfigInline(admin.StackedInline):
    model = Config


class PipelineAdmin(admin.ModelAdmin):
    inlines = [ConfigInline]

我进行了数据库迁移。

您在一对一字段中设置了
parent\u link=True
。根据it部门的报告:

为True时并用于从其他混凝土继承的模型中 模型,表示此字段应用作返回的链接 父类,而不是将 通常通过子类化隐式创建

显然,在对另一个模型(称为多表继承)进行子类化时,您不会使用它,因此这没有意义。将您的实现更改为:

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)
此外,它仍然没有意义,因为这样一来,两个表中基本上都有一个外键,我相信这不是您想要的,只在一个模型中保持关系(根据您的情况,外键更适合位于哪个表中):


根据与Abdul的对话,OneToOne字段只能与模型继承一起使用。下面的代码可以工作,但没有得到官方支持。我发现文件在这方面有些含糊不清。所以,考虑一下这个问题:< /P>
class Pipeline(models.Model):
    pipeline = models.OneToOneField(
         'Pipeline', on_delete=models.CASCADE, 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, parent_link=True )
因此,缺少使用父链接。否则,在管理面板中,无法同时创建两个模型

据此:如前所述,Django通过指定父链接字段,将自动创建一个OneToOneField,将您的子类链接回任何非抽象父模型。如果要控制链接回父类的属性的名称,可以创建自己的OneToOneField并设置parent_link=True,以指示您的字段是链接回父类的字段


我完全误解了
父链接的目的,谢谢你指出这一点。现在,一切都正常了。但是,现在我没有引用管道中的配置。@Sören正如我所说的,Django自动构造对相关模型的引用,因为这是一对一字段,它将是小写的模型名称。所以
pipeline.config
将为您提供配置。或者,如果您需要其他名称,您可以设置
related\u name
,因此如果您编写
pipeline=models.OneToOneField('pipeline',on\u delete=models.CASCADE,null=True,related\u name='other\u name\u for\u config')
然后
管道。配置的其他\u名称\u将为您提供相关的对象。但是我似乎无法通过管理视图一次性创建两个实例。它会提示我添加配置,但配置需要一个尚未创建的管道。来自django手册:如前所述,Django将自动创建一个OneToOneField,将您的子类链接回任何非抽象父模型。如果要控制链接回父类的属性的名称,可以创建自己的OneToOneField并设置parent_link=True,以指示您的字段是链接回父类的字段。“@Sören,正如我在问题中提到的那样。不管怎样,正如我再次提到的,在反面,每个相关字段(一对一,外键,多对多,每个字段都有自己的某种形式的相关访问器)都会自动生成一个相关的访问器。