Mostrar información de subclase en list_display django

Tengo dos clases en modelos.py:

class ModelOne (modelos.Modelo): field_one = modelos.CharField (max_length = 100) field_two = models.CharField (max_length = 200) field_three = modelos.CharField (max_length = 300) [...] #otros campos def __unicode __ (self ): return self.field_one class ModelTwo (modelos.Model): Relations_model_one = models.ForeignKey (ModelOne) other_field = models.CharField (max_length = 50) [...] def __unicode __ (self): return self.relation_model_one.field_one

Y su administración en admin.py es esta:

clase ModelTwoInline (admin.StackedInline): model = ModelTwo extra = 0 class ModelOneAdmin (admin.ModelAdmin): list_display = ('field_one', 'field_two', 'field_three',) inlines = [ModelTwoInline]

Mi pregunta es: ¿Puedo mostrar los campos del ModelTwo en list_display del ModelOne? (Lo mismo para list_filter y search_fields)

¡Necesito esto porque tengo muchas subclases relacionadas con la clase principal!

preguntado el 16 de mayo de 11 a las 19:05

2 Respuestas

Puedes mostrar lo que quieras en list_display escribiendo un método de instancia con el @property decorador, que luego devuelve todo lo que necesita, y lo incluye en list_display. No creo que eso funcione para list_filter sin embargo.

Entonces, volvamos a tu ModelOne clase:

class ModelOne(models.Model):
    [...]

    def __unicode__(self):
        return self.field_one

    @property
    def model_two_other_field(self):
        return ', '.join([m2.other_field for m2 in self.modeltwo_set.all()])

Luego, en su ModelOneAdmin:

class ModelOneAdmin(admin.ModelAdmin):
    list_display = ('field_one', 'field_two', 'field_three', 'model_two_other_field')
    [...]

Me gustaría señalar, para que conste, que cuando haga esto, necesitará un acceso a la base de datos para cada Se muestra una instancia de ModelOne. Por lo tanto, si enumera 50 instancias, incurrirá en la sobrecarga de 50 consultas separadas (una por cada llamada de self.modeltwo_set.all()). Eso no significa necesariamente que no deba hacerlo; podría ser la respuesta correcta, dependiendo de su situación. Solo tenga en cuenta que podría ser una operación bastante costosa.

contestado el 17 de mayo de 11 a las 01:05

Debe utilizar el nombre relacionado de los campos o RelatedModel._meta.get_fields

class ModelOneAdmin(admin.ModelAdmin):
    list_display = ('field_one', 'field_two', 'field_three')
    inlines = [ModelTwoInline]

    def get_list_display(self, request):
        extra_fields = [
            f.name for model in self.inlines 
            for f in model._meta.get_fields(include_hidden=False) 
        ]
        return self.list_display + extra_fields

Respondido el 04 de Septiembre de 18 a las 02:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.