Python Django:AttributeError:“;对象没有属性“;

Python Django:AttributeError:“;对象没有属性“;,python,django,django-models,Python,Django,Django Models,我试图将一个类中计算的属性转换到另一个类中。我被卡住了 在“奖励”课程中,我需要从“保证水平”中减去“免赔额”。在“质押”类中,我需要从“金额”中减去“不应纳税”以返回“可扣除的总额” 在“我的模板”中访问它时,此选项可以正常工作: (${{ reward.deductible}} is tax deductible or ${{ reward.not_taxable }} is not tax deductible) 在服务器上运行时,我收到一个内部服务器错误:[Django]错误(外部IP

我试图将一个类中计算的属性转换到另一个类中。我被卡住了

在“奖励”课程中,我需要从“保证水平”中减去“免赔额”。在“质押”类中,我需要从“金额”中减去“不应纳税”以返回“可扣除的总额”

在“我的模板”中访问它时,此选项可以正常工作:

(${{ reward.deductible}} is tax deductible or ${{ reward.not_taxable }} is not tax deductible)
在服务器上运行时,我收到一个内部服务器错误:[Django]错误(外部IP):内部服务器错误:/projects/fund/billing/1000

以下是回溯:

Internal Server Error: /projects/fund/billing/1000/
Traceback (most recent call last):
File "/var/venv/website/lib/python2.7/site-packages/django/core/handlers/base.py", line 132, in get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/var/sites/proj/payments/views.py", line 98, in pledge_billing
html = template.render(c)
File "/var/venv/website/lib/python2.7/site-packages/django/template/backends/django.py", line 74, in render
return self.template.render(context)
File "/var/venv/website/lib/python2.7/site-packages/django/template/base.py", line 209, in render
return self._render(context)
File "/var/venv/website/lib/python2.7/site-packages/django/template/base.py", line 201, in _render
return self.nodelist.render(context)
File "/var/venv/website/lib/python2.7/site-packages/django/template/base.py", line 903, in render
bit = self.render_node(node, context)
File "/var/venv/website/lib/python2.7/site-packages/django/template/base.py", line 917, in render_node
return node.render(context)
File "/var/venv/website/lib/python2.7/site-packages/django/template/loader_tags.py", line 135, in render
return compiled_parent._render(context)
File "/var/venv/website/lib/python2.7/site-packages/django/template/base.py", line 201, in _render
return self.nodelist.render(context)
File "/var/venv/website/lib/python2.7/site-packages/django/template/base.py", line 903, in render
bit = self.render_node(node, context)
File "/var/venv/website/lib/python2.7/site-packages/django/template/base.py", line 917, in render_node
return node.render(context)
File "/var/venv/website/lib/python2.7/site-packages/django/template/loader_tags.py", line 65, in render
result = block.nodelist.render(context)
File "/var/venv/website/lib/python2.7/site-packages/django/template/base.py", line 903, in render
bit = self.render_node(node, context)
File "/var/venv/website/lib/python2.7/site-packages/django/template/base.py", line 917, in render_node
return node.render(context)
File "/var/venv/website/lib/python2.7/site-packages/django/template/base.py", line 957, in render
output = self.filter_expression.resolve(context)
File "/var/venv/website/lib/python2.7/site-packages/django/template/base.py", line 647, in resolve
obj = self.var.resolve(context)
File "/var/venv/website/lib/python2.7/site-packages/django/template/base.py", line 787, in resolve
value = self._resolve_lookup(context)
File "/var/venv/website/lib/python2.7/site-packages/django/template/base.py", line 825, in _resolve_lookup
current = getattr(current, bit)
File "/var/sites/proj/projects/models.py", line 81, in deductible_total
return self.get_deductible_total()
File "/var/sites/proj/projects/models.py", line 77, in get_deductible_total
return (self.amount - self.not_taxable)
AttributeError: 'Pledge' object has no attribute 'not_taxable'    
models.py

class Pledge(models.Model):
    project = models.ForeignKey('Project')
    amount = models.DecimalField(decimal_places=2,max_digits=10,
        default=D('0.00'))
    reward = models.ForeignKey('Reward',blank=True,null=True,
        on_delete=models.SET_NULL)

    objects = PledgeManager()

    def get_deductible_total(self):
        return (self.amount - self.not_taxable) 

    @property
    def deductible_total(self):
        return self.get_deductible_total()


class Reward(models.Model):
    project = models.ForeignKey('Project')
    title = models.CharField(max_length=255)
    pledge_level = models.DecimalField(decimal_places=2, max_digits=10)
    deductible = models.DecimalField(decimal_places=2, max_digits=10)
    description = models.TextField(blank=True)

    def get_not_taxable(self):
        return (self.pledge_level - self.deductible)

    @property
    def not_taxable(self):
        return self.get_not_taxable()
因为我在项目应用程序中编辑models.py文件,所以我在项目上进行了迁移。也许由于项目的变化,支付应用程序也需要在其上运行迁移


非常感谢你的帮助

更改方法如下:

def get_deductible_total(self):
    return (self.amount - self.reward.not_taxable) 
顺便说一句,通常分离属性和方法是没有意义的,您也可以在属性内部进行计算。你本来可以

@property
def deductible_total(self):
    return (self.amount - self.not_taxable) 
但将它们分开的一些原因:
1) 属性不会引发错误,因此如果您在需要异常的其他地方调用它,则将它们分开是有意义的。
2) 如果出于某种原因需要一个返回结果的方法(或函数,基本上是可调用的),那么还需要将它们分开。可能不是这种情况,可以使用
lambda
s进行打击。

仅供参考。

奖励=型号。外键
。似乎不是一个
奖励对象。或者我错过了什么。@Jean-Françoisfare对不起,我没抓住你的重点。它还会是什么(当然,除非为空)?我的意思是,奖励的类别不是奖励。检查初始标记为@makaveli的答案。。。谢谢你的解释和建议!还想指出的是,我必须检查物品是否有奖励(有可能有一个没有奖励的承诺)<代码>def获取可扣除总额(自我):如果不是自我奖励:返回D('0')返回(自我金额-自我奖励。不征税)