Ich denke, der aufstrebende Standard für Nicht-Rel-Datenbanken ist django-nonrel. Ich weiß nicht, ob django-nonrel produktionsbereit ist oder ob es Redis unterstützt, aber sie haben eine Anleitung zum Schreiben eines benutzerdefinierten No-SQL-Backends.
Leider glaube ich nicht, dass es einfach ist, Unterstützung für Redis auf einem Standard-Django zu schreiben wie ein DatabaseBackend
. Es gibt viele Mechaniken und Abläufe in den Django-Modellen, die einfach von einer ACID-Datenbank ausgehen. Was ist mit syncdb
? Und was ist mit Querysets
?
Sie können jedoch versuchen, einen einfachen Ansatz zu schreiben, indem Sie models.Manager
und viel Feinabstimmung auf Ihrem Modell verwenden. Zum Beispiel:
# Helfer
def fill_model_instance(instance, values):
"""Füllt eine Modellinstanz mit den Werten aus dem Wörterbuch Werte auf"""
attributes = filter(lambda x: not x.startswith('_'), instance.__dict__.keys())
for a in attributes:
try:
setattr(instance, a, values[a.upper()])
del values[a.upper()]
except:
pass
for v in values.keys():
setattr(instance, v, values[v])
return instance
class AuthorManager(models.Manager):
# Sie können versuchen, die Standardmethoden zu verwenden.
# Aber es sollte verdammt schwer sein ...
def get_query_set(self):
raise NotImplementedError("Vielleicht können Sie ein nicht relationales Queryset() schreiben! ")
def latest(self, *args, **kwargs):
# redis Aktuelle Abfrage
pass
def filter(self, *args, **kwargs):
# redis Filterabfrage
pass
# Benutzerdefinierte Methoden, die Sie verwenden können, anstatt sie neu zu schreiben
# die Standardmöglichkeiten.
def open_connection(self):
# Öffnen einer Redis-Verbindung
pass
def search_author(self, *args, **kwargs):
self.open_connection()
# Schreiben Sie Ihre Abfrage. Ich weiß nicht, wie dieses glänzende nicht-SQL funktioniert.
# Geht davon aus, dass es für jeden übereinstimmenden Autor ein Wörterbuch zurückgibt.
authors_list = [{'name': 'Leibniz', 'email': 'iinventedcalculus@gmail.com'},
'name': 'Kurt Godel', 'email': 'self.consistent.error@gmail.com'}]
return [fill_instance(Author(), author) for author in authors_list]
class Author(models.Model):
name = models.CharField(max_length=255)
email = models.EmailField(max_length=255)
def save(self):
raise NotImplementedError("TODO: Schreiben Sie einen Redis-Speicher")
def delete(self):
raise NotImplementedError("TODO: Schreiben Sie einen Löschspeicher")
class Meta:
managed = False
Bitte beachten Sie, dass ich nur eine Skizze gemacht habe, wie Sie die Django-Modelle anpassen können. Ich habe diesen Code nicht getestet und ausgeführt. Ich schlage zunächst vor, dass Sie django-nonrel untersuchen.