Django 指定外键将创建一个新对象

Django 指定外键将创建一个新对象,django,django-models,wagtail,wagtail-snippet,Django,Django Models,Wagtail,Wagtail Snippet,我正试图在django建立一对多的关系,到目前为止效果良好 @register_snippet class CarPart(models.Model): title = models.CharField(max_length=50) class Meta: verbose_name_plural = 'Car Parts' def __str__(self): return self.title class CarParts(CarP

我正试图在django建立一对多的关系,到目前为止效果良好

@register_snippet
class CarPart(models.Model):
    title = models.CharField(max_length=50)

    class Meta:
        verbose_name_plural = 'Car Parts'

    def __str__(self):
        return self.title

class CarParts(CarPart):
    source_page = ParentalKey(
        'home.CarPage', related_name='carparts'
    )

    carpart = models.ForeignKey(
        CarPart,
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        related_name='+'
    )

    panels = [
        SnippetChooserPanel('catpart'),
    ]

class CarPage(BasePage):
    content_panels = BasePage.content_panels + [
       InlinePanel('carparts', label="Car Part"),
    ]
    def get_context(self, request):
       context = super().get_context(request)

    return context
这工作正常-我可以将多个汽车零件指定给一辆汽车,但问题是,每当我指定一个汽车零件时,它会自动创建一个新的空对象,而不是汽车零件片段或表格中的原始数据

当我这样做的时候,它显示的是正确的部分

{% for part in car.carparts.all %} 
    {{ part.title }}
{% endfor %}
但是,当我从汽车零件代码段中删除空对象时,它会删除汽车中的汽车零件,并且当相关汽车零件被删除时,for循环似乎不会显示任何值。我不明白为什么它要创建新的空对象,却要分配正确的ID

比如:


如果我从页面编辑器中选择“汽车零件<代码>引擎并保存它-它会创建一个新的空对象,但id似乎是正确的。它在页面布局中显示引擎,但当我删除新的空对象时,相关的引擎关联将消失。

Cartpart不应继承自CarPart,也应有一个外键

class CarParts(models.Model):
    source_page = ParentalKey(
        'home.CarPage', related_name='carparts'
    )

    carpart = models.ForeignKey(
        CarPart,
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        related_name='+'
    )

    panels = [
        SnippetChooserPanel('catpart'),
    ]

不确定它是否相关,但您有一个输入错误-
SnippetChooserPanel('catpart'),
。应该是
carpart
是的,这是一个输入错误。为什么Cartpart继承自carpart,然后还有一个carpart的外键?实际上这很可能是你的问题。我试过了,它说,
类“CarParts”中的本地字段“id”与基类“carpart”中同名的字段冲突。
修复了这个问题。是的,错误的继承是问题所在。