Ошибка Django: тип объекта «Invoice_Line» не имеет атрибута «объекты» - PullRequest
0 голосов
/ 10 ноября 2019

Я определил метод в admin.py для суммирования сумм после уплаты налогов:

def _grand_total(self, object_id):
        line_amounts = Invoice_Line.objects.filter(appointment_ref=object_id).values_list('total_after_tax', flat=True)
        return reduce((lambda x,y: x + y), line_amounts)

Запрос ORM, определенный в этой строке: Invoice_Line.objects.filter(appointment_ref=object_id).values_list('total_after_tax', flat=True)

, генерирует ошибку ниже:

объект типа 'Invoice_Line' не имеет атрибута 'objects'

Код модели, показанный ниже:

models.py:

class Appointment(models.Model):
    create_date = models.DateField(auto_now_add=True, db_index=True)
    appointment_ref = models.AutoField(primary_key=True)
    appointment_date = models.DateField()

class Invoice_Line (models.Model):
    appointment_ref = models.ForeignKey(Appointment, on_delete=models.CASCADE)
    inv_line_date = models.DateTimeField(auto_now_add=True)
    item_price = models.DecimalField(max_digits=7, decimal_places=2, default=00000.00, verbose_name='Service Amount')
    tip_amount = models.DecimalField(max_digits=7, decimal_places=2, default=00000.00, verbose_name='Tip Amount')
    item_quantity = models.PositiveSmallIntegerField(blank=False, null=True, default=0, verbose_name='Service Quantity')
    total_before_tax = models.DecimalField(max_digits=7, decimal_places=2, default=00000.00, verbose_name='Before Tax')
    stax_rate = models.DecimalField(max_digits=5, decimal_places=4, blank=True, null=True, verbose_name='Sales Tax Rate')
    stax_amount = models.DecimalField(max_digits=7, decimal_places=2, default=00000.00, verbose_name='Sales Tax Amount')
    total_after_tax = models.DecimalField(max_digits=7, decimal_places=2, default=00000.00, verbose_name='Total After Tax')

Я выполняю тот же запрос в оболочке / интерпретаторе, и он работает просто отлично. Могу ли я получить помощь в исправлении этой ошибки?

Любая помощь будет оценена!

Спасибо!

1 Ответ

1 голос
/ 12 ноября 2019

Исправлена ​​проблема:

Как я уже упоминал в своем вопросе, я определил метод ниже в admin.py:

def _grand_total(self, object_id):
        line_amounts = Invoice_Line.objects.filter(appointment_ref=object_id).values_list('total_after_tax', flat=True)
        return reduce((lambda x,y: x + y), line_amounts)

И я также зарегистрировал модель "Invoice_Line" вadmin.py, как показано ниже:

@admin.register (Invoice_Line)
class Invoice_Line(admin.ModelAdmin):
    list_display = ('__str__','inv_line_date','total_after_tax','appointment_ref')
    readonly_fields = ('item_price','total_before_tax','stax_rate','stax_amount','total_after_tax')

Проблема заключалась в том, что вы не можете назвать класс, который вы используете для регистрации модели в admin.py, точно так же, как вы назвали модель в models.py.

Другими словами, вы не можете сделать это:

models.py:

class Invoice_Line (models.Model):
    ......
    ......

admin.py:

@admin.register (Invoice_Line)
class Invoice_Line (admin.ModelAdmin):
    .......
    .......

Один разЯ изменил имя класса в admin.py на « class InvoiceLineAdmin (admin.ModelAdmin): », запрос ORM, вызвавший ошибку, которую я пытался исправить, работал нормально.

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