He buscado en el desbordamiento de pila una respuesta a esta pregunta (probablemente simple), pero la mayoría de las soluciones que veo parecen demasiado complicadas y difíciles de entender.Campo de modelo de Django para la clase base abstracta
Tengo un modelo "Publicar" que es una clase base abstracta. Modelos "Anuncio" y "Evento" heredan de la publicación.
Ahora mismo estoy manteniendo listas de eventos y anuncios relacionados en otros modelos. Por ejemplo, tengo los campos "removed_events" y "removed_announcements" en otro modelo.
Sin embargo, en mi proyecto, "removed_events" y "removed_announcements" se tratan exactamente de la misma manera. No es necesario desambiguar entre un "evento eliminado" y un "anuncio eliminado". En otras palabras, sería suficiente con mantener un registro de campo de "removed_posts".
No sé cómo (o quizás no) crear un campo "removed_posts", ya que Post es abstracto. Sin embargo, en este momento siento que me estoy repitiendo en el código (y tengo que hacer un montón de desorden, algunos controles para descubrir si la publicación que estoy viendo es un evento o un anuncio y agregarlo al sitio apropiado). campo eliminado).
¿Cuál es la mejor opción aquí? Podría hacer que las publicaciones no sean abstractas, pero los objetos Post nunca deberían crearse, y no creo que pueda aplicar esto en un objeto no abstracto.
Mi comprensión de las bases de datos es débil, pero tengo la impresión de que hacer una publicación no abstracta complicaría la base de datos debido a las uniones. ¿Esto es un gran problema?
Finalmente, hay otros campos en otros modelos en los que me gustaría condensar cosas que equivalen a una event_list y una announce_list en una post_list, pero esos campos deben ser desambiguados. Podría filtrar la post_list según el tipo de publicación, pero la llamada a filter() sería más lenta que poder acceder directamente al evento y a las listas de anuncios por separado, ¿no? Alguna sugerencia aqui?
Gracias a todos por leer esto.
Con una solución como esa, también podría usar GenericForeignKey para el anuncio/evento en el modelo que necesita la clave externa en lugar de usar el intermediario. –
Dependiendo de si el modelado polimórfico original tenía un FK en lugar de un m2m, es cierto. De todos modos, es difícil eliminar claves externas cuando ya no las necesita, mucho más que tratar una m2m como un FK más un inverso uno a uno.Si el modelo debe ser lo suficientemente genérico, es parche m2m o mono, como en el campo explícito.contribute_to_class() ... – rewritten