MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

django व्यवस्थापक फ़िल्टर और mongodb:प्रतिपादन करते समय डेटाबेस त्रुटि पकड़ा गया:यह क्वेरी डेटाबेस द्वारा समर्थित नहीं है

मैं एक पायथन/Django newb हूं, लेकिन मैंने AllValuesFieldListFilter को https://github.com/django/django/blob/stable/1.4.x/django/contrib/admin/filters.py (अपनी शाखा को Django के अपने संस्करण में बदलना सुनिश्चित करें) और फिर मैंने कॉल को distinct पर हटा दिया . सामान का एक गुच्छा आयात करना पड़ा। तब यह काम करता है। मैंने इसे फिर से अलग बनाने के लिए @ एलेक्सीएमके के उत्तर से परिवर्तनों को भी लागू किया।

1.4 के लिए:

from django.contrib.admin.filters import FieldListFilter
from django.contrib.admin.util import (get_model_from_relation, reverse_field_path, get_limit_choices_to_from_path, prepare_lookup_value)
from django.utils.translation import ugettext_lazy as _
from django.utils.encoding import smart_unicode, force_unicode

class MongoFieldListFilter(FieldListFilter):
def __init__(self, field, request, params, model, model_admin, field_path):
    self.lookup_kwarg = field_path
    self.lookup_kwarg_isnull = '%s__isnull' % field_path
    self.lookup_val = request.GET.get(self.lookup_kwarg, None)
    self.lookup_val_isnull = request.GET.get(self.lookup_kwarg_isnull,
                                             None)
    parent_model, reverse_path = reverse_field_path(model, field_path)
    queryset = parent_model._default_manager.all()
    # optional feature: limit choices base on existing relationships
    # queryset = queryset.complex_filter(
    #    {'%s__isnull' % reverse_path: False})
    limit_choices_to = get_limit_choices_to_from_path(model, field_path)
    queryset = queryset.filter(limit_choices_to)

    def uniquify(coll):  # enforce uniqueness, preserve order
      seen = set()
      return [x for x in coll if x not in seen and not seen.add(x)]

    self.lookup_choices = uniquify(queryset.order_by(field.name).values_list(field.name, flat=True))

    super(MongoFieldListFilter, self).__init__(field, request, params, model, model_admin, field_path)

def expected_parameters(self):
    return [self.lookup_kwarg, self.lookup_kwarg_isnull]

def choices(self, cl):
    from django.contrib.admin.views.main import EMPTY_CHANGELIST_VALUE
    yield {
        'selected': (self.lookup_val is None
            and self.lookup_val_isnull is None),
        'query_string': cl.get_query_string({},
            [self.lookup_kwarg, self.lookup_kwarg_isnull]),
        'display': _('All'),
    }
    include_none = False
    for val in self.lookup_choices:
        if val is None:
            include_none = True
            continue
        val = smart_unicode(val)
        yield {
            'selected': self.lookup_val == val,
            'query_string': cl.get_query_string({
                self.lookup_kwarg: val,
            }, [self.lookup_kwarg_isnull]),
            'display': val,
        }
    if include_none:
        yield {
            'selected': bool(self.lookup_val_isnull),
            'query_string': cl.get_query_string({
                self.lookup_kwarg_isnull: 'True',
            }, [self.lookup_kwarg]),
            'display': EMPTY_CHANGELIST_VALUE,
        }

फिर इसे इस तरह से इस फ़िल्टर का उपयोग करने के लिए निर्दिष्ट करें:

list_filter = (('myfield', MongoFieldListFilter),)

यह अच्छा है क्योंकि कोई पैचिंग आवश्यक नहीं है।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. नेवला कुल, गतिशील रूप से कुछ फ़ील्ड नहीं जोड़ सकता:{$नहीं; शून्य }

  2. MongoDB - वस्तुओं की एक आंतरिक सूची को अनुक्रमित करें

  3. मोंगोडब कनेक्शन पूलिंग

  4. पांडा का उपयोग करके बड़े डेटा कार्यप्रवाह

  5. नेवला | मिडलवेयर | रोलबैक ऑपरेशन प्री/पोस्ट हुक द्वारा किया जाता है जब कोई त्रुटि फेंकी जाती है