Django Redis подключение бэкэнд или как его реализовать - PullRequest
5 голосов
/ 28 декабря 2010

Есть ли какой-нибудь плагин или сторонний бэкэнд для управления подключениями redis в Django, поэтому методы в view.py не должны явно подключаться к redis для каждого запроса?

Если нет, то как бы вы начали его реализовывать? Новый плагин? новый бэкэнд? новое промежуточное ПО django?

Спасибо.

1 Ответ

5 голосов
/ 28 декабря 2010

Я думаю, что новым стандартом для баз данных, не относящихся к Rel, является django-nonrel . Я не знаю, готов ли django-nonrel к работе или поддерживает redis, но у них есть руководство по написанию пользовательского интерфейса no-sql .

К сожалению, я не думаю, что написание поддержки redis на стандартном django так же просто, как написание DatabaseBackend. В механике и рабочем процессе моделей django есть много вещей, которые просто предполагают использование базы данных ACID. А как насчет syncdb? А про Querysets?

Тем не менее, вы можете попытаться написать подход для бедных, используя models.Manager и много настроек в вашей модели. Например:

# helper   
def fill_model_instance(instance, values):
    """ Fills an model instance with the values from dict values """                                    
    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 ):

    # You may try to use the default methods.
    # But should be freaking hard...
    def get_query_set(self):
        raise NotImplementedError("Maybe you can write a Non relational Queryset()! ")

    def latest(self, *args, **kwargs):
        # redis Latest query
        pass

    def filter(self, *args, **kwargs):
       # redis filter query
       pass

    # Custom methods that you may use, instead of rewriting
    # the defaults ones.
    def open_connection(self):
        # Open a redis connection
        pass

    def search_author( self, *args, **kwargs ):
        self.open_connection()

        # Write your query. I don't know how this shiny non-sql works.
        # Assumes it returns a dict for every matched author.
        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: write a redis save")

     def delete(self):
         raise NotImplementedError(""TODO: write a delete save")

     class Meta:
          managed = False

Пожалуйста, не делайте, чтобы я только сделал набросок того, как вы можете настроить модели django. я не протестировал и запустил этот код. Сначала я предлагаю вам исследовать Джанго-Нонреля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...