<div dir="ltr"><div dir="ltr"><div class="gmail_quote"><div dir="ltr">El lun., 10 dic. 2018 a las 18:09, lasizoillo (<<a href="mailto:lasizoillo@gmail.com">lasizoillo@gmail.com</a>>) escribió:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><br><div class="gmail_quote"><div><br></div><div>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?</div></div></div></blockquote><div><br></div><div><br></div><div>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.</div><div><br></div><div>Los GenericForeignKeys tienen varios problemas, en mi opinión:</div><div><br></div><div>- 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.</div><div>- 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.<br><br>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:</div><div><br></div><div><font face="monospace, monospace">class Comment(models.Model):<br>    ...unos cuantos campos...<br>    parent = models.ForeignKey(CommentableModel, on_delete=models.CASCADE)</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="arial, helvetica, sans-serif">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.</font></div></div></div></div>