Filtro en la propiedad de clave externa en django-nonrel
-
13-10-2019 - |
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!
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(),})