объект ‘super’ не имеет атрибута ‘objects’ Python Django

#python #django

#python #django

Вопрос:

вам нужно получить с filter помощью метода get_related_filter класса

число просмотров

 modelPath = 'Money.models'
app_model = importlib.import_module(modelPath)
cls = getattr(app_model, 'Money')
related_result = cls().get_related_filter(search_query='search_query')
 

models.py

 class Money(models.Model):
    money = models.DecimalField(max_digits=19, blank=True, default=0, decimal_places=2)   

    def get_related_filter(self, **kwargs):
        results = super(Money, self).objects.filter(Q(money__icontains=kwargs['search_query']))
        return results

    def __str__(self):
        return self.money
 

почему выдает 'super' object has no attribute 'objects' Python Django , а не возвращает filter

Комментарии:

1. Почему бы вам просто не использовать Money.objects.filter(...) . Ошибка означает , что суперкласс of Money , the Model не имеет objects .

2. Делает модели. У класса Money есть атрибут под названием «объекты»? Я предполагаю, что нет.

3. @NicholasHunter: да, поскольку метакласс Model (the ModelBase ) заполнит его, если вы не укажете другого менеджера.

Ответ №1:

С ним нет смысла работать super(Money, self) по двум причинам:

  1. этот прокси-объект будет разрешен Model , но Model ни у его родителей нет objects атрибута; и
  2. даже если бы это было так, вы можете получить доступ только .objects к классу модели, а не к экземпляру.

Таким образом, вы можете фильтровать с помощью:

 class Money(models.Model):
    money = models.DecimalField(max_digits=19, blank=True, default=0, decimal_places=2)   

    def get_related_filter(self, search_query, **kwargs):
        return Money.objects.filter(money__icontains=search_query)

    def __str__(self):
        return str(self.money) 

Также __str__ предполагается, что он возвращает строку, а не десятичную дробь, поэтому вы должны вернуть str(self.money) , а не self.money .