Django: ¿accede a la instancia del modelo desde ModelAdmin?

Tengo un modelo para pedidos en una aplicación de tienda web, con una clave principal de incremento automático y una clave externa para sí mismo, ya que los pedidos se pueden dividir en varios pedidos, pero la relación con el pedido original debe mantenerse.

class Order(models.Model):
    ordernumber = models.AutoField(primary_key=True)
    parent_order = models.ForeignKey('self', null=True, blank=True, related_name='child_orders')
    # .. other fields not relevant here

He registrado una clase OrderAdmin para el sitio de administración. Para la vista detallada, he incluidoparent_order en elfieldsets atributo. Por supuesto, de forma predeterminada, esto enumera todas las órdenes en un cuadro de selección, pero este no es el comportamiento deseado. En cambio, para pedidos que no tienen un pedido principal (es decir, que no se han dividido de otro pedido;parent_order es NULL / None), no se deben mostrar pedidos. Para los pedidos que se han dividido, esto solo debe mostrar el pedido de padre único.

Hay un método ModelAdmin bastante nuevo disponible,formfield_for_foreignkey, eso parece perfecto para esto, ya que el conjunto de consultas se puede filtrar dentro de él. Imagine que estamos viendo t, la vista detallada de la orden # 11234, que se ha dividido de la orden # 11208. El código está debajo de

def formfield_for_foreignkey(self, db_field, request, **kwargs):
    if db_field.name == 'parent_order':
        # kwargs["queryset"] = Order.objects.filter(child_orders__ordernumber__exact=11234)
        return db_field.formfield(**kwargs)
    return super(OrderAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

a fila comentada funciona cuando se ejecuta en un shell de Python, devolviendo un conjunto de consultas de un solo elemento que contiene la orden # 11208 para la # 11234 y todas las demás órdenes que pueden haberse separado de ella.

Por supuesto, no podemos codificar el número de pedido allí. Necesitamos una referencia a laordernumber campo de la instancia de pedido cuya página de detalles estamos viendo. Me gusta esto

kwargs["queryset"] = Order.objects.filter(child_orders__ordernumber__exact=?????)

No he encontrado ninguna manera de reemplazarlo ????? con una referencia a la instancia de pedido "actual", y he cavado bastante profundo. @self dentroformfield_for_foreignkey se refiere a la instancia de ModelAdmin, y si bien tiene unamodel atributo, no es la instancia del modelo de pedido (es una referencia de ModelBase; self.model () devuelve una instancia, pero su número de pedido es Ninguno).

Una solución podría ser extraer el número de pedido de request.path (/ admin / orders / order / 11234 /), pero eso es realmente feo. Realmente deseo que haya una mejor manera.

Respuestas a la pregunta(6)

Su respuesta a la pregunta