设计代码来处理名为“contractBundles”的对象的传输。在“合同”应用程序中的models.py中有这个:
class contractBundleManager():
# def trade(self, buyer, seller, amount):
def add (self, user=pgamedb_models.Player, contractName=str, amount=float):
contractList = contract.objects.all()
for c in contractList:
if contractName == c.contractText:
user.money = user.money - (amount * c.value)
return self.create(contract=c, volume=amount, owner=user)
class contractBundle(models.Model):
objects = contractBundleManager()
contract = models.ForeignKey('contract')
volume = models.FloatField()
owner = models.ForeignKey(pgamedb_models.Player)
def __str__(self):
return '%10.2f x %s -> %s' % (self.volume, self.contract.shortName, self.owner.user.username)
在其他地方,我想让人们按下按钮购买套装:
from contracts import models as cmodels
...
if request.method == 'POST':
...
elif 'Buy' in request.POST:
[set up activeUser, polName, amount]
cmodels.contractBundle.objects.add(user=activeUser, contractName=polName, amount=amount)
然而,当代码调用contractBundle.objects.add()
方法时,我收到以下错误:
AttributeError at [url]
'Manager' object has no attribute 'add'
Request Method: POST
Request URL: [url]
Django Version: 1.3.1
Exception Type: AttributeError
Exception Value:
'Manager' object has no attribute 'add'
Exception Location: ...views.py in [method], line 56
Python Executable: /System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python
Python Version: 2.7.1
有什么想法可能会发生这种情况?
答案 0 :(得分:3)
这里有一些错误。
首先,您的经理类需要继承models.Manager:
class contractBundleManager(models.Manager):
这是定义create
之类的所有代码的地方。
此外,使用类/类型作为函数参数的默认值似乎是一个非常糟糕的主意。如果要记录函数需要的类型,则应使用docstring。
评论后修改不,我不是指回复语句或您调用self.create
的方式。我指的是contractBundleManager.add
方法中的默认值。你永远不应该这样做。如果有人在没有传递user
参数的情况下调用您的方法,该函数将使用您定义的默认值 - 这是一个类。 Python中的类是可变的,因此您的函数实际上将修改Player
类的定义。
实际上,这不是显示调用函数的正确类型的方法。省略默认值,并使用docstring。
答案 1 :(得分:1)
#model
class contractBundle(models.Model):
objects = models.Manager( )
contact_bundle_manager = contractBundleManager( )
#view
cmodels.contact_bundle_manager.add(user=activeUser, contractName=polName, amount=amount)