Soy nuevo en Django, estoy buscando una forma de crear un modelo en Django basado en la instancia de otro modelo, pero filtrado.

Tengo una tabla llamada Person, que tiene nombre y rol, en mi models.py:

class Person(models.Model):

id = models.UUIDField(primary_key=True) 
name = models.CharField(max_length=100) 
role = models.CharField(max_length=100) 
created_on = models.DateTimeField(auto_now_add=True)

class Meta:
    db_table = 'person'

Lo que quiero es poder en mi admin.py llamar a alguna subclase, que mostrará solo actores (rol = "actores"):

@admin.register(Actor)
class Actor(admin.ModelAdmin):...

¿Es posible? ¿O tengo que crear una mesa más solo con actores?

Sé que puedo usar list_filter = ('role',), pero esto no es lo que estoy buscando, necesito actores exclusivamente.

Veo la solución como algo como esto:

class Actor(models.Model):
    objects = Person.objects.filter(role='actor')
    class Meta:
        verbose_name = 'actor'

O

class Actor(Person):
    self.objects.filter(role='actor')
    class Meta:
        verbose_name = 'actor'

Eso obviamente no funciona.

1
MStikh 22 ene. 2021 a las 20:13

1 respuesta

La mejor respuesta

Puede usar un modelo Proxy para esto:

class ActorManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(role='actors')

class Actor(Person):
    objects = ActorManager()
    
    class Meta:
        proxy = True

Los modelos proxy son solo un proxy del modelo heredado (Persona aquí), es decir, no se crea una nueva tabla. Aquí hemos creado un administrador personalizado para que los roles siempre se filtren. Ahora solo registre este modelo en el sitio de administración. Referencias: modelos proxy, Administradores personalizados

1
Abdul Aziz Barkat 22 ene. 2021 a las 17:38