#django #django-models
#django #django-модели
Вопрос:
Разработка кода для обработки передач объектов, называемых «contractBundles». Имейте это в моделях.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 '.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
Есть мысли, почему это может происходить?
Ответ №1:
Здесь есть несколько неправильных вещей.
Во-первых, ваш класс manager должен наследоваться от моделей.Менеджер:
class contractBundleManager(models.Manager):
Именно здесь определяется весь подобный код create
.
Кроме того, кажется, что действительно плохая идея использовать классы / типы в качестве значений по умолчанию для параметров функции. Если вы хотите документировать, какие типы нужны функции, вам следует использовать строку документа.
Редактировать после комментария Нет, я не имею в виду оператор return или способ, которым вы вызываете self.create
. Я имею в виду значения по умолчанию в contractBundleManager.add
методе. Вы никогда не должны этого делать. Если кто-то вызывает ваш метод без передачи user
параметра, функция будет использовать значение по умолчанию, которое вы определили, — это класс. Классы в Python изменчивы, поэтому ваша функция фактически изменит определение Player
класса.
На самом деле, это не способ показать правильные типы для вызова функции. Оставьте значения по умолчанию и используйте строку документа.
Комментарии:
1. Кроме того, кажется, что действительно плохая идея использовать классы / типы в качестве значений по умолчанию для параметров функции. Я предполагаю, что вы имеете в
return self.create(contract=c, volume=amount, owner=user)
виду? Почему это плохая форма?
Ответ №2:
#model
class contractBundle(models.Model):
objects = models.Manager( )
contact_bundle_manager = contractBundleManager( )
#view
cmodels.contact_bundle_manager.add(user=activeUser, contractName=polName, amount=amount)
Комментарии:
1. Спасибо, это продвинуло его вперед, но теперь он говорит мне, что нет атрибута «создать» — разве это не должно быть встроено для всех объектов?