Как работать с несколькими подтипами одного супертипа в админке 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)
Тогда вы могли бы зарегистрировать Клиента и Поставщика, и они бы разделяли поля из Контакта, но все равно были бы отделены друг от друга.