Возникли проблемы с функциональностью менеджера в django

#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. Спасибо, это продвинуло его вперед, но теперь он говорит мне, что нет атрибута «создать» — разве это не должно быть встроено для всех объектов?