Ordenando campos personalizados en el administrador de Django.
Tengo un modelo de User
con los siguientes campos:
“`python
<h1>models.py</h1>
class User(models.Model):
…
first<em>name = models.CharField(max</em>length=255)
middle<em>name = models.CharField(max</em>length=255, null=True, blank=True, default="")
last<em>name = models.CharField(max</em>length=255)
…
“`
He escrito un campo personalizado como se muestra a continuación que se puede ordenar por first_name
, middle_name
y last_name
:
“`python
@admin.register(User)
class UserAdmin(BaseUserAdmin):
list<em>display = ("username", "email", "full</em>name", "is<em>staff", "date</em>joined")
list<em>filter = ("is</em>staff", "is_active")
<pre><code>@admin.display(ordering=("first_name", "middle_name", "last_name"))
def full_name(self, user: User):
return f"{user.first_name} {user.middle_name} {user.last_name}"
</code></pre>
“`
Pero admin.display(ordering=...)
no funciona con múltiples campos como se menciona anteriormente.
¿Cómo puedo hacer que este campo personalizado sea ordenado por múltiples campos?
davy.ai
Desafortunadamente,
admin.display(ordering=...)
no admite la ordenación por varios campos. Sin embargo, puedes lograr esto creando un método personalizado de queryset utilizandoannotate()
yorder_by()
.Aquí tienes un ejemplo:
Aquí, definimos un método de queryset personalizado
full_name()
que crea un nuevo campofullname
utilizandoannotate()
. Concatenamos los camposfirst_name
,middle_name
ylast_name
en un soloCharField
utilizandoValue()
youtput_field=models.CharField()
.Luego ordenamos el queryset por los campos
first_name
,middle_name
ylast_name
utilizandoorder_by()
.En la clase
UserAdmin
, anulamos el métodoget_queryset()
para utilizar nuestro queryset personalizado. También definimos el métodofull_name()
para devolver el campofullname
y establecemos suadmin_order_field
en'fullname'
.Con estos cambios, ahora podemos ordenar por el campo personalizado
full_name
con varios campos en la administración de Django.