Как работать с несколькими подтипами одного супертипа в админке Django

Что было бы лучшим решением для добавления / редактирования нескольких подтипов.

Например, класс супертипа Контакт с классом подтипа Client и классом подтипа Supplier. Способ, показанный здесь, работает, но когда вы редактируете Контакт, вы получаете обе строки: подтип Клиент и подтип Поставщик.

Таким образом, даже если вы хотите добавить только Клиента, вы также получите поля для поставщика и наоборот. Если вы добавите третий подтип, вы получите три группы полей подтипа, в то время как вы фактически хотите только одну группу подтипа, в упомянутом примере: Клиент.

Например:

class Contact(models.Model):
    contact_name = models.CharField(max_length=128)

class Client(models.Model):
    contact = models.OneToOneField(Contact, primary_key=True)
    user_name = models.CharField(max_length=128)

class Supplier(models.Model):
    contact.OneToOneField(Contact, primary_key=True)
    company_name = models.CharField(max_length=128)

и в admin.py

class ClientInline(admin.StackedInline):
    model = Client

class SupplierInline(admin.StackedInline):
    model = Supplier

class ContactAdmin(admin.ModelAdmin):
    inlines = (ClientInline, SupplierInline,)

class ClientAdmin(admin.ModelAdmin):
    ...

class SupplierAdmin(admin.ModelAdmin):
    ...

Теперь, когда я хочу добавить Клиента, то есть только Клиента, я редактирую Контакт и получаю строки как для Клиента, так и для Поставщика. И, конечно, то же самое для поставщика.

Есть ли способ избежать этого? Когда я хочу добавить / отредактировать клиента, который я вижу только "Встроенный для клиента", и когда я хочу добавить / отредактировать поставщика, который я вижу только "Встроенный для поставщика", при добавлении / редактировании контакта?

Или, возможно, есть другой подход. Любая помощь или предложение будет принята с благодарностью.

1 ответ

Что если вместо того, чтобы использовать один-один внешний ключ для связи с вами, унаследованный от него?

class Contact(models.Model):
    contact_name = models.CharField(max_length=128)

    class Meta:
        abstract=True # Don't use this line if you want Contact to have its own table

class Client(Contact):
    user_name = models.CharField(max_length=128)

class Supplier(Contact):
    company_name = models.CharField(max_length=128)

Тогда вы могли бы зарегистрировать Клиента и Поставщика, и они бы разделяли поля из Контакта, но все равно были бы отделены друг от друга.

Другие вопросы по тегам