在django中遇到管理器功能问题

时间:2011-10-16 05:55:02

标签: django django-models

设计代码来处理名为“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

有什么想法可能会发生这种情况?

2 个答案:

答案 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)