Встроенные ссылки на собственный внешний ключ - PullRequest
1 голос
/ 30 марта 2012

Я пытаюсь написать встроенный редактор для определенного типа, который я пишу. Мои типы выглядят так:

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'>

Одд. Почему это не работает с моей очень простой строкой?


EDIT

Я обнаружил, что это работает, если я изменю расположение ссылок на класс 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 не является / не владеет a Donor. Плюс, это немного безумно. Класс Person не обязательно должен знать, кому он вообще принадлежит.

1 Ответ

0 голосов
/ 30 марта 2012

У вас не может быть встроенного лица для Person, но донором должен быть владелец отношения (где поле OneToOne).

В вашем случае вам понадобятся DonorInline и PersonAdmin.

...