2009-01-09 20 views
12

tengo un problema muy simple. Necesito crear un modelo, que represente un elemento de la lista ordenada. Este modelo puede ser implementado como esto:Listas ordenadas en django

class Item(models.Model): 
    data = models.TextField() 
    order = models.IntegerField() 

o como esto:

class Item(models.Model): 
    data = models.TextField() 
    next = models.ForeignKey('self') 

¿Por qué camino se prefiere? ¿Qué inconvenientes tiene cada solución?

+0

¡Hola! Estoy teniendo el mismo problema con el mismo problema. Una solución en la que pensé es usar el modelo en tu 'solución 1'. Pero en lugar de mover todo, solo cambié el valor del 'artículo reordenado'. Por ejemplo, quiero mover un elemento entre los artículos con el orden 9 y 10, simplemente cambiaré el orden del artículo a 9.5. ¿Crees que esto puede ser malo para las tablas largas? –

Respuesta

20

Básicamente, la segunda solución que propone es una lista vinculada. La lista enlazada implementada a nivel de base de datos generalmente no es una buena idea. Para recuperar una lista de elementos n, necesitará el acceso a la base de datos n (o utilice consultas complicadas). En cuanto al rendimiento, recuperar una lista en O (n) no es muy eficiente.

En el código normal, la lista vinculada se utiliza para obtener un mejor rendimiento de inserción en comparación con las matrices (no es necesario mover todos los elementos). En su base de datos, la actualización de todos los elementos no es tan complicado en tan sólo 2 consultas:

UPDATE item.order = item.order + 1 FROM item WHERE order > 3 
INSERT INTO item (order, ...) VALUES (3, ...) 

recuerdo ver una aplicación reutilizable que implementa todo eso y una buena interfaz de administración, pero no lo encuentro en este momento ...

Para resumir, definitivamente use la solución n. ° 1 y aléjese de la solución n. ° 2 a menos que tenga una muy buena razón para no hacerlo.

+0

¿Esta es la aplicación que mencionaste? http://nyquistrate.com/django/orderedlist/ –

+0

Dos bibliotecas más que ayudan a administrar el campo "orden" en un modelo de Django son https://pypi.python.org/pypi/django-positions/ y https://pypi.python.org/pypi/django-ordered-model/. Las posiciones de Django se ven mejor a simple vista. – Nathan

6

Eso depende de lo que quieras hacer.

El primero parece mejor hacer una sola consulta en la base de datos y obtener todos los datos en el orden correcto

El segundo parece mejor para insertar un elemento entre dos elementos existentes (ya que en el primero que se' debe cambiar muchos elementos si los números son secuenciales)

Usaría el primero, porque parece ajustarse mejor a una tabla de base de datos, que es cómo django almacena los datos del modelo detrás del capó.

-6

Hay otra solución.

class Item(models.Model): 
    data = models.TextField() 

Puede simplemente extraer o alinear la lista de Python en el campo de datos y cargarlo. Este es bueno para actualizar y leer, pero no para buscar, p. buscando todas las listas que contienen un elemento específico.

Cuestiones relacionadas