Pregunta

¿Cuál es la mejor práctica para el filtrado basado en la propiedad de una clave externa en una base de datos no relacionales? Yo entiendo que la falta de apoyo join hace las cosas más complicadas, y por eso me preguntaba cómo otros consiguieron su alrededor.

En mi caso, tengo acontecimientos, que pertenecen a los sitios, que pertenecen a las regiones. Quiero filtrar todos los eventos en una región dada. Un Event tiene una propiedad site que es una clave externa a una Site, que a su vez tiene una clave externa region a un Region:

region = Region.objects.get(id=regionID)
events = Event.objects.filter(site__region=region)

Esto no funciona, porque requiere un site__region join y que no está soportado en django-nonrel se ejecuta en Google App Engine. (Me da Caught DatabaseError while rendering: This query is not supported by the database. como un error.) Yo he estado tanto iteración a través de eventos, añadiendo aquellos que coincidan con una lista:

events = list()
region = Region.objects.get(id=regionID)
for event in Event.object.all():
    if event.site.region==region:
        events.append(event)

Es esta una buena manera de estar haciendo cosas? ¿Hay algo tonto que he pasado por alto? Gracias de antemano!

¿Fue útil?

Solución

Esto es una solución muy ineficiente, ya que eliminar la referencia de sitio y región, causando montones y montones de consultas. Esto no va a escalar más allá de tal vez 100 eventos en su base de datos.

La mejor solución es eliminar la normalización de los datos mediante la copia, por ejemplo, Identificación de la región en Evento en Guardar (). A continuación, puede ver directamente Event.objects.filter (REGION_ID = ID de región). El código resultante se vuelve menos limpio y fácil de mantener, pero eso es como funcionan las cosas en DBs no relacionales, hoy .

Todo lo que se puede decir en este momento es: Esperar hasta finales de enero si es posible. ;)

Otros consejos

Enero se ha ido y ahora es compatible con dbindexer sencilla SE UNE. Se puede leer aquí: http : //www.allbuttonspressed.com/blog/django/joins-for-nosql-databases-via-django-dbindexer-first-steps

Si ya está utilizando dbindexer simplemente debe registrar su índice de uso de algo como esto:

# photo/dbindexes.py:

from models import Event
from dbindexer.lookups import StandardLookup
from dbindexer.api import register_index

register_index(Event, {'site__region': StandardLookup(),})
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top