[pyar] [Django] modelo genérico

Fabian Ezequiel Gallina galli.87 en gmail.com
Lun Mar 19 21:14:26 ART 2012


El 19 de marzo de 2012 20:41, samuel alfredo bustamante barrera <
samuelbustamant en gmail.com> escribió:

> El día 19 de marzo de 2012 20:32, Facundo Olano
> <facundo.olano en gmail.com> escribió:
> >> Hola amigos,
> >> tengo un problema que no lo puedo resolver, voy a la explicación:
> >>
> >> tengo un modelo Casa y un modelo Departamento, los cuales tienen
> >> campos diferentes.
> >> necesito alguna forma en la cual crear algún modelo Inmuebles que sea
> >> algo genérico
> >> a los otros (no se si se dice así).
> >
> >
> > Se entiende más o menos, si te refirieras a objetos pelados en vez de
> > modelos de django, probablemente tendrías una clase Inmueble de la que
> > heredan Casa y Departamento, no? Django tiene un par de alternativas para
> > herencia de modelos, pero a mi entender no siempre funcionan exactamente
> > como uno quisiera, para saber cuál es la que mejor se adapta a tus
> > necesidades o como resolverlo si ninguna lo hace, tendrías que explicar
> un
> > poco por qué necesitás esas relaciones; como esperas que tu código
> funcione
> > o qué ventajas esperás obtener al introducir el modelo Inmueble.
> >
> > Saludos.
> >
> > _______________________________________________
> > pyar mailing list pyar en python.org.ar
> > http://listas.python.org.ar/listinfo/pyar
> >
> > PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
> >
> > La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> > Argentina - http://www.usla.org.ar
>
> Hola Facundo,
> voy a tratar de explicar mejor lo que necesito:
>
> estoy tratando de hacer una pagina de inmuebles (cada usuario puede
> subir un inmueble) y creé dos modelos (pueden ser más), Casa y
> Terreno, que son dos cosas muy distintas pero son inmuebles a la vez,
> lo que necesito es relacionar esos modelos como inmuebles ó como
> anuncios, ya que por ejemplo en la pagina principal necesito listar
> los últimos 30 inmuebles ingresados, ya sea Casa, Terreno,
> Departamentos, etc.
>
> No se si se entendió un poco más la idea.
> Desde ya, Muchas Gracias.
>

Podés definir un modelo Base del cuál parten tus modelos.

Tenés 2 opciones.

a) Que el model base sea abstracto, por lo que cada model que herede de él
va a tener TODOS los campos definidos en él + sus particulares y no va a
haber otra relación entre sí más que poseer los mismo campos.

b) Que el model base sea un model *no abstracto* y que Departamento,
Terreno, Casa, ... hereden de él. El model Base va a existir en la DB y los
modelos heredados van a tener sólo sus campos particulares y a su vez van a
tener un OneToOne a el modelo Base. La ventaja de esta forma es que vas a
poder hacer queries para obtener instancias de Departamento, Terreno, Casa
a través de los campos compartidos haciendo queries sobre el modelo Base.

a) se logra agregando un class Meta en la definición del modelo que define
que es abstracto.

class Model:(models.Model):

    class Meta:
        abstract = True


Con b) tendrías algo de este estilo:

class Inmueble(models.Model):
    precio = models.DecimalField(max_length=8, decimal_places=2)

class Departamento(Inmueble):
    expensas = models.DecimalField(max_length=4, decimal_places=2)

class Terreno(Inmueble):
    condiciones = models.TextField(blank=True)

Y con este acercamiento podrías tener por ejemplo todos las instancias de
Inmueble que están relacionadas a Departamento y Terreno por precio
haciendo queries sobre Inmueble:

Inmueble.objects.filter(precio__lte=20000)

Cada resultado del queryset va a tener una relación a una instancia del
hijo que corresponda, el related name default es el nombre del modelo hijo
en minúsculas, así que por ejemplo una instancia de Inmueble que es padre
de departamento podría acceder al objeto departamento como
inmueble.departamento.


La forma que te conviene depende de tus requerimientos y de lo que estes
buscando.


Espero haber dejado un poco claras las ideas y diferencias de cada forma.
La doc de Django explica estos asuntos de forma completa
https://docs.djangoproject.com/en/dev/topics/db/models/



Saludos,
Fabián E. Gallina
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20120319/869c5e6a/attachment.html>


More information about the pyar mailing list