[Py-MAD] [Python-es] ¿Foro integrable en django?

César García Tapia tapia at openshine.com
Mon Dec 10 19:37:53 CET 2018


El lun., 10 dic. 2018 a las 18:09, lasizoillo (<lasizoillo at gmail.com>)
escribió:

>
>
> Y ahora te hago yo una pregunta técnica que siempre me surge con este tipo
> de cosas: ¿Usais GenericForeignKeys para unir los hilos de comentarios a
> vuestras diferentes entidades (artículo, pagina, receta de cocina, lo que
> sea) o huis de ellos como de la peste? Siempre me pasa que por un lado me
> parece un diseño elegante y desacoplado, pero por otro que las relaciones
> n:m que se generan acaban haciendo de mi vida una pesadilla. ¿Cómo lo
> resolvéis vosotros?
>


No como la peste, pero sí que intento evitarlos siempre que puedo, a no ser
que la variedad de entidades a enlazar sea muy muy alta (que queramos
permitir poner comentarios asociados a 20 modelos distintos), o que haya
que hacer queries transversales a todas las entidades (por ejemplo: "dime
el usuario que ha hecho más comentarios en toda la aplicación, me da igual
dónde"). En esos casos sí pueden tener sentido.

Los GenericForeignKeys tienen varios problemas, en mi opinión:

- Hay que conocerlos bien para entender lo que están haciendo, con lo que
la legibilidad y mantenibilidad del código se resiente. Si has visto código
que los use, no siempre es obvio lo que está haciendo. Si lo único que es
tener comentarios en un par de sitios, creo que no merece la pena.
- El problema más gordo de todos: el esquema de base de datos que generan
es muy, muy, muy problemático. Ten en cuenta que no son foreign keys de
verdad, sino únicamente una convención definida por Django, por lo que la
integridad referencial en la base de datos se va a tomar vientos.

La mayoría de las veces, se puede tener funcionalidad parecida simplemente
usando herencia de modelos. Por ejemplo, te creas un modelo
"CommentableModel", y todo lo que pueda admitir comentarios heredaría de
él. Luego el modelo del comentario sería algo tipo:

class Comment(models.Model):
    ...unos cuantos campos...
    parent = models.ForeignKey(CommentableModel, on_delete=models.CASCADE)

O, más fácil aún, creas modelos intermedios para cada modelo "Comentable".
Esto no es muy DRY, pero si el número de modelos comentables es pequeño, al
final acaba siendo lo más fácil de leer, entender y mantener.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.es.python.org/pipermail/madrid/attachments/20181210/71ee9763/attachment.html>


More information about the Madrid mailing list