-2

我想一次生成几个相关的模型对象,这些对象通过stacked.Inline. 我可以在管理视图中创建对象。但是,当我转到管道模型的列表视图时,我得到:

“管道”对象没有属性“参数”

我有几乎相同的设置与其他模型一起使用,所以我不确定为什么它在这种情况下不起作用。它抱怨“管道”没有参数

模型.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)

管理员.py

class ConfigInline(admin.StackedInline):
    model = Config


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

我做了数据库迁移。

4

2 回答 2

1

parent_link=True在一对一字段中设置。根据它的文档

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, default='-p -q -x -u -l -m -r')        
    pipeline = models.OneToOneField('Pipeline', on_delete=models.CASCADE, 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
于 2021-04-20T17:23:30.227 回答
0

根据与 Abdul 的对话,OneToOne 字段只能与模型继承一起使用。以下工作,但它不受官方支持。我发现文档在这方面有些模棱两可。所以,考虑这是一个黑客:

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 以指示您的字段是返回父类的链接。” 从

https://docs.djangoproject.com/en/dev/topics/db/models/#specifying-the-parent-link-field

Django Admin:OneToOne 关系作为内联?

于 2021-04-20T18:40:44.533 回答