2016-08-21 3 views
0

Может кто-нибудь, пожалуйста, предложите мне, почему я получаю эту ошибку.Объект QuerySet не имеет атрибута 'filter_on_search' Python Django

Ниже модели с менеджером

class Customer(models.Model): 
    customer_id  = models.AutoField(primary_key=True) 
    customer_name = models.CharField(max_length=256) 
    customer_mobile = models.CharField(max_length=10) 
    customer_email = models.CharField(max_length=100,null=True) 
    customer_dob = models.DateField() 
    customer_remarks= models.CharField(max_length=256,null=True) 
    row_status  = models.BooleanField(choices=ROW_STATUS, default=True) 
    created_date = models.DateTimeField() 
    updated_date = models.DateTimeField() 

    objects   = MyClassManager() 

    def __unicode__(self): 
     return self.customer_name 

    def as_dict(self): 
     """ 
     Create data for datatables ajax call. 
     """ 
     return {'customer_name': self.customer_name, 
       'customer_mobile': self.customer_mobile, 
       'customer_dob': self.customer_dob, 
       } 

Менеджер начинается здесь ---------

class MyClassMixin(object): 
    def q_for_search_word(self, word): 
     """ 
     Given a word from the search text, return the Q object which you can filter on, 
     to show only objects containing this word. 
     Extend this in subclasses to include class-specific fields, if needed. 
     """ 
     return Q(name__icontains=word) | Q(supplier__name__icontains=word) 

    def q_for_search(self, search): 
     """ 
     Given the text from the search box, search on each word in this text. 
     Return a Q object which you can filter on, to show only those objects with _all_ the words present. 
     Do not expect to override/extend this in subclasses. 
     """ 
     q = Q() 
     if search: 
      searches = search.split() 
      for word in searches: 
       q = q & self.q_for_search_word(word) 
     return q 

    def filter_on_search(self, search): 
     """ 
     Return the objects containing the search terms. 
     Do not expect to override/extend this in subclasses. 
     """ 
     return self.filter(self.q_for_search(search)) 

class MyClassQuerySet(QuerySet, MyClassMixin): 
    pass 

class MyClassManager(models.Manager, MyClassMixin): 
    def get_query_set(self): 
     return MyClassQuerySet(self.model, using=self._db) 

Это мое мнение -----

class MyAPI(JSONViewMixin, View): 
    "Return the JSON representation of the objects" 
    def get(self, request, *args, **kwargs): 

     class_name = kwargs.get('cls_name') 
     params = request.GET 
     # make this api general enough to handle different classes 
     klass = getattr(sys.modules['mudraapp.models'], class_name) 

     # TODO: this only pays attention to the first sorting column 
     sort_col_num = params.get('iSortCol_0', 0) 
     # default to value column 
     sort_col_name = params.get('mDataProp_{0}'.format(sort_col_num), 'value') 
     search_text = params.get('sSearch', '').lower() 
     sort_dir = params.get('sSortDir_0', 'asc') 
     start_num = int(params.get('iDisplayStart', 0)) 
     num = int(params.get('iDisplayLength', 25)) 
     obj_list = klass.objects.all() 
     sort_dir_prefix = (sort_dir=='desc' and '-' or '') 
     if sort_col_name in col_name_map: 
      sort_col = col_name_map[sort_col_name] 
      obj_list = obj_list.order_by('{0}{1}'.format(sort_dir_prefix, sort_col)) 

     filtered_obj_list = obj_list 
     if search_text: 
      filtered_obj_list = obj_list.filter_on_search(search_text) //Here I am getting error 

     d = {"iTotalRecords": obj_list.count(),    # num records before applying any filters 
      "iTotalDisplayRecords": filtered_obj_list.count(), # num records after applying filters 
      "sEcho":params.get('sEcho',1),      # unaltered from query 
      "aaData": [obj.as_dict() for obj in filtered_obj_list[start_num:(start_num+num)]] # the data 
     } 

     return self.json_response(d) 

Я использую этот код для точной разбивки на страницы и поиск разбиения на страницы работает хорошо, но во время поиска он дает ошибку Я нахожусь llowing следующие Учебник для этого http://racingtadpole.com/blog/datatables-with-ajax-and-django/

ответ

1

Вы создали в MyClassManager метод имеет wrong name:

def get_query_set(self): 

Который вместо этого должен быть:

# query_set -> queryset 
def get_queryset(self): 
+0

Спасибо, проблема решена. Но теперь я получаю эту ошибку, не могли бы вы мне помочь? FieldError at/Customer/ Невозможно разрешить ключевое слово 'name' в поле. Возможные варианты: created_date, customer_dob, customer_email, customer_id, customer_mobile, customer_name, customer_remarks, referance_id, row_status, updated_date –

+1

В методе 'q_for_search_word' измените' name__contains' на 'customer_name__contains'. Поле в вашей модели 'Customer' называется' customer_name', а не 'name'. – solarissmoke

+0

Спасибо! –

0

Вы используете filter_on_search на вашем QuerySet. Вместо этого вам нужно использовать его вместо objects.

Итак, вы звезда, делая

obj_list = klass.filter_on_search 

Однако, похоже, вы можете переместить все ваши логики с точки зрения менеджера.

Для чего это стоит, есть удивительный пакет, который делает именно то, что вы хотите в интеграции Django с DataTables: https://pypi.python.org/pypi/django-datatables-view

Смежные вопросы