关于python:AttributeError – 类型对象’Services’没有属性’service_price’

AttributeError - type object 'Services' has no attribute 'service_price'

我正在尝试创建类似于发票程序的程序,以创建发票并计算价格。

我仍然在模型部分,我试图计算所有服务包括在一张发票中,并在invoices.subtotal中更新它们。

我的问题是无法将services.service_price的汇总值传递到invoices.subtotal。

当我单击[保存并继续编辑]时,我看到:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
AttributeError at /admin/invoices/invoices/1/

type object 'Services' has no attribute 'service_price'

Request Method:  POST
Request URL:  http://192.168.1.3/invmaster/admin/invoices/invoices/1/
Django Version:  1.2.1
Exception Type:  AttributeError
Exception Value:  

type object 'Services' has no attribute 'service_price'

Exception Location:  /opt/invmaster/invoices/models.py in save, line 24
Python Executable:  /usr/bin/python
Python Version:  2.6.5

下面是一些代码:

发票/模型.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
  1 from django.db import models
  2
  3 from invmaster.general.models import Client
  4 from invmaster.general.models import job_name
  5 from invmaster.general.models import my_data
  6
  7 from decimal import *
  8 import math
  9
 10 ### Invoices table
 11 class Invoices (models.Model):
 12         invoice_id = models.AutoField(primary_key=True)
 13         client_name = models.ForeignKey(Client)
 14         date_created = models.DateField()
 15         subtotal = models.DecimalField('Precio sin IVA:(euros)',max_digits=6, decimal_places=2)
 16         total =  models.DecimalField('Precio Final:(euros)',max_digits=6, decimal_places=2, blank=True, null=True)
 17         paid = models.BooleanField()
 18         class Meta:
 19                 db_table = u'invInvoices'
 20
 21         def save(self, *args, **kwargs):
 22                 #self.subtotal = int(Services.service_price)
 23                 f = my_data()
 24                 self.subtotal = Services.service_price
 25                 self.total = self.subtotal * ((Decimal(f.IVA)/100)+1)
 26                 super(Invoices, self).save(*args, **kwargs)
 27
 28
 29
 30 ### Services table
 31 class Services (models.Model):
 32         JOB_CUANTITY = ( (u'H',u'Horas'),
 33                         (u'U',u'Unidades'),
 34                         )
 35         invoice_id = models.ForeignKey(Invoices)
 36         service_type = models.CharField('Tipo',max_length=1, choices=JOB_CUANTITY)
 37         service_cuantity = models.IntegerField('Cantidad/Horas', max_length=2)
 38         service_name = models.ForeignKey(job_name)
 39         service_unit_price = models.DecimalField('Precio por unidad (euros):',max_digits=6, decimal_places=2,blank=True, null=True)
 40         service_price = models.DecimalField('Precio (euros):',max_digits=6, decimal_places=2, blank=True, null=True)
 41
 42         class Meta:
 43                 db_table = u'invServices'
 44         def __unicode__(self):
 45                 return u'%s' % (self.service_name)
 46         def save(self, *args, **kwargs):
 47                 self.service_price = self.service_cuantity * self.service_unit_price
 48                 super(Services, self).save(*args, **kwargs)

其他文件:常规/型号.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
### General table
  8 class my_data (models.Model):
...
 16         IVA = models.IntegerField(max_length=2, default='18') ### IVA = VAT # 18 = 18%
...
 26 ### Clients table
 27 class Client (models.Model):
 28         client_id = models.AutoField(primary_key=True)
 29         client_name = models.CharField(max_length=45, unique=True)
...
### Jobs
 58 class job_name (models.Model):
 59         job_type_id = models.AutoField(primary_key=True)
 60         job_name = models.CharField('Servicio/Producto',max_length=60, unique=True)
 61         job_price = models.DecimalField('Precio sin IVA (euros:)', max_digits=6, decimal_places=2)
 62
 63         class Meta:
 64                 db_table = u'genJobNames'
 65
 66         def __unicode__(self):
 67                 return u'%s (%s)' % (self.job_name, self.job_price)

抱歉,我的英语和这个问题,如果它是愚蠢的(我不是程序员,我是系统管理员,我是python/django中的新手:-)

提前谢谢

干杯

更新:

文件夹:linadmin.homeunix.net/models.txt文件linadmin.homeunix.net/admin.txt


您没有任何汇总值。在这个上下文中,Services.service_price没有任何意义——它是在类级别上对模型字段本身的引用,而不是对它的任何特定实例的值的引用。

您需要一些代码来计算实际值。请记住,您有一个从服务到发票的foreignkey,这意味着每个发票可以有许多服务。所以大概你想要的是与这张发票相关的所有服务的总价值。您可以使用聚合来解决这个问题:

1
2
3
from django.db.models import Sum
service_sum = self.services_set.aggregate(Sum('service_price'))
self.subtotal = service_sum['service_price__sum']

它针对数据库查询所有相关服务。