内联引用拥有的外键

时间:2012-03-29 20:40:11

标签: django django-admin

我正在尝试为我正在编写的特定类型编写内联编辑器。我的类型看起来像这样:

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

class Donor(models.Model):
    # a donor _is_ a person
    person = models.OneToOneField("Person")

目标是能够从Person编辑Donor中存储的信息,因为Person更像是抽象类型(尽管不完全)。这是我的管理员:

class PersonInline(admin.StackedInline):
    model = Person
    fields = ('first_name', 'last_name')

class DonorAdmin(admin.ModelAdmin):
    inlines = (PersonInline,)

admin.site.register(Donor, DonorAdmin)

不幸的是,当我在管理网站中创建新的Donor时,我看到以下错误:

Exception at /core/donor/add/
<class 'core.models.Person'> has no ForeignKey to <class 'core.models.Donor'>

奇。为什么它不能用我非常简单的内联工作?


修改

我发现如果我将引用的位置更改为Person类而不是Donor,它会起作用,但这确实会污染我的设计:

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    donor = models.OneToOneField("Donor", blank=True, null=True)
    recipient = models.OneToOneField("Recipient", blank=True, null=True)
    recipient_dependant = models.OneToOneField("RecipientDependant", blank=True, null=True)

class Donor(models.Model):
    pass

class Recipient(models.Model):
    pass

class RecipientDependant(models.Model):
    pass

这似乎对我不利,因为Donor 是/拥有 Person对象,但Person 不是/ {不拥有一个Donor。另外,这有点疯狂。 Person类根本不需要知道它拥有什么。

1 个答案:

答案 0 :(得分:0)

您不能为Person设置内联,但让关系所有者(OneToOne字段所在的位置)成为捐赠者。

在您的情况下,您需要一个DonorInline和一个PersonAdmin。