Django admin: Inline direto para o segundo nível de relacionamento
Eu tenho três níveisInvoice
modelo que eu gostaria de exibir na área de administração do Django ... em uma "espécie deespecial" maneira.
Permitam-me fornecer um pouco de plano de fundo:
CadaInvoice
é conformado por váriosSubInvoice
(s) e cadaSubInvoice
é conformado por váriosInvoiceItem
(s), que contêm uma discriminação dasProducts
adquirido por um cliente.
Logicamente falando, seria algo assim (espero que a arte ascii funcione)
+---------- Invoice id=3 -----------+
| Full total: $100.00 |
| |
| +----- Sub Invoice id=1 -----+ |
| | Subtotal $70 | |
| | | |
| | Item 1 in SubInv.1 | |
| | Item 2 in SubInv.1 | |
| | Item 3 in SubInv.1 | |
| |____________________________| |
| |
| +----- Sub Invoice id=2 -----+ |
| | Subtotal $30 | |
| | | |
| | Item 1 in SubInv.2 | |
| | Item 2 in SubInv.2 | |
| |____________________________| |
| |
|___________________________________|
Os modelos parecem mais ou menos (eles foram simplificados para esta pergunta) como:
class Invoice(models.Model):
full_total = DecimalField(...)
# has a .sub_invoices RelatedManager through a backref from SubInvoice
class SubInvoice(models.Model):
sub_total = DecimalField(...)
invoice = ForeignKey('server.Invoice', related_name='sub_invoices')
# has an .items RelatedManager through a backref from InvoiceItem
class InvoiceItem(models.Model):
sub_invoice = ForeignKey('server.SubInvoice', related_name='items')
product = ForeignKey('server.Product', related_name='+')
quantity = PositiveIntegerField(...)
price = DecimalField(...)
Agora, eu sei que o aninhamento de dois níveis de relacionamento no Django Admin é muito complexo e não estou tentando aninhar oInvoiceItem
noSubInvoice
e aninhe aquele noInvoice
. Isso seria ótimo, mas estou pronto para desistir disso devido às dificuldades das linhas aninhadas.Não: o que eu gostaria de fazer é mostrar oInvoice
e, comoinline
, EstáItems
, "pulando" atravésInvoice.sub_invoices__items
. Eu realmente não me importo muito com as informações mostradas noSubInvoice
(s), mas me preocupo com as informações noInvoice
E noInvoiceItems
.
O que quero dizer é que, basicamente, eu gostaria (ou"Eu poderia viver com") se oInvoice
A visualização de administração tinha a seguinte aparência:
+---------- Invoice id=3 -----------+
| Full total: $100.00 |
| |
| +----------------------------+ |
| | | |
| | Item 1 in SubInv.1 | |
| | Item 2 in SubInv.1 | |
| | Item 3 in SubInv.1 | |
| | Item 1 in SubInv.2 | |
| | Item 2 in SubInv.2 | |
| |____________________________| |
| |
|___________________________________|
(InvoiceItems
como uma linha doInvoice
sem mostrar qualquer informação sobre oSubInvoices
iniciar)
Eu tentei o seguinte noadmin.py
:
class InvoiceItemInline(admin.StackedInline):
fk_name = 'sub_invoice__invoice'
model = InvoiceItem
class InvoiceAdmin(admin.ModelAdmin):
inlines = (InvoiceItemInline,)
Mas isso me dá um erro:
<class 'server.admin.invoices.InvoiceItemInline'>: (admin.E202) 'server.InvoiceItem' has no field named 'sub_invoice__invoice'.
Eu também tentei diretamente isso:
class InvoiceItemInline(admin.StackedInline):
model = InvoiceItem
class InvoiceAdmin(admin.ModelAdmin):
inlines = (InvoiceItemInline,)
Mas então (este que eu estava esperando) produz este erro:
<class 'server.admin.invoices.InvoiceItemInline'>: (admin.E202) 'server.InvoiceItem' has no ForeignKey to 'server.Invoice'.
Existe alguma maneira de conseguir isso? Agradeço antecipadamente.
PS:
A partir de agora, tenho uma solução "remendada" que parece ser a maneira canônica:
Registre oInvoice
modelo.Registrar umadmin.ModelAdmin
na linha para oSubInvoice
(este inline será "inline" no diretórioInvoice
ModelAdmin).Registre também oSubInvoice
no administrador, para que possamos calcular um link para sua visualização de administrador.Adicione umna linha vista doInvoiceItems
para o mencionado acimaSubInvoice
vista deAdicione um link à visualização de administrador doSubInvoice
(s) noInvoice
Praticamente o que é descrito neste outroTÃO. responda.
Mas o problema com essa abordagem é que ela não me deixa ver oInvoice
e os seusInvoiceItems
de relance (vejo a fatura, com sub_invoices nela e, em seguida, dentro das sub_invoices inline, há um link para os InvoiceItems nos quais preciso clicar para ver os itens). Seria ótimo se eu pudesse me livrar da necessidade desse link.
Isto é o que eu tenho agora, basicamente:
+---------- Invoice id=3 -----------+
| Full total: $100.00 |
| |
| +----- Sub Invoice id=1 -----+ | +--- Sub Invoice id=1 ---+
| | Subtotal $70 | | | Item 1 in SubInv.1 |
| | | | | Item 2 in SubInv.1 |
| | <a>Click for items ==============> | Item 3 in SubInv.1 |
| |____________________________| | |________________________|
| |
| +----- Sub Invoice id=2 -----+ |
| | Subtotal $30 | | +--- Sub Invoice id=2 ---+
| | | | | Item 1 in SubInv.2 |
| | <a>Click for items ==============> | Item 2 in SubInv.2 |
| |____________________________| | |________________________|
| |
|___________________________________|