Почему Loan не определен, когда type (self) работает нормально? - PullRequest
1 голос
/ 29 октября 2010

Следующий код используется администратором для сохранения объекта Loan

import uuid

from django.db import models
from django.contrib.auth.models import User
from apps.partners.models import Agent

# Create your models here.
class Loan(models.Model):
    """ This is our local info about the loan from the LOS """
    guid = models.CharField(max_length=64, blank=True)
    number = models.CharField(max_length=64, blank=True)
    name = models.CharField(max_length=64)
    address = models.CharField(max_length=128)
    address2 = models.CharField(max_length=128, null=True, blank=True)
    city = models.CharField(max_length=32)
    state = models.CharField(max_length=2)
    zipcode = models.CharField(max_length=9)
    borrowers = models.ManyToManyField(User, related_name='loan_borrowers')
    officers = models.ManyToManyField(Agent, related_name='loan_officers')

    def __unicode__(self):
        return "%s %s, %s  %s" % (self.address, self.city, self.state, self.zipcode)

    def save(self, force_insert=False, force_update=False, using=None):
        """ Adds a GUID if one is not present """
        if self.guid == None:
            self.guid = uuid.uuid4().hex
        super(Loan, self).save(force_insert, force_update, using)

Когда я добираюсь до супер-линии, я получаю:

TypeError: super() argument 1 must be type, not None

Вызов сохранениясделанный из строки 597 options.py и в этот момент известно, что объект obj является объектом Loan.

, если я заменю строку super () на

    super(type(self), self).save(force_insert, force_update, using)

, все в порядке.Что здесь происходит?

Остальная часть файла:

class Need(models.Model):
    from apps.public_portal.models import DocumentType
    loan = models.ForeignKey(Loan, null=False, blank=False)
    borrower = models.ForeignKey(User, null=False, blank=False)
    doctype = models.ForeignKey(DocumentType, null=False, blank=False)
    satisfied = models.DateTimeField(null=True, blank=True)
    first_request = models.DateTimeField(auto_now_add=True)
    last_request = models.DateTimeField(null=True, blank=True)

    def __unicode__(self):
        return "%s from %s for %s" % (self.doctype.name, self.borrower.get_full_name(), self.loan)

Так что я не вижу, как что-либо связывает Loan с None

Ответы [ 2 ]

1 голос
/ 30 октября 2010

Разработчики Django предлагают шаблон для переопределения метода save () модели . Используя этот шаблон, реализация для вашего метода save () должна быть:

def save(self, *args, **kwargs):
    if self.guid == None:
        self.guid = uuid.uuid4().hex
    super(Blog, self).save(*args, **kwargs) # Call the "real" save() method.

Позвольте мне предложить другой подход: использовать сигналы !

Вместо попытки переопределить метод save (), используйте сигнал предварительного сохранения , чтобы инициализировать поле guid перед вставкой / обновлением записи. Добавьте следующий код в ваш файл model.py:

def add_loan_guid( sender, instance, **kwargs ):
    """Ensure that a Loan always has a guid"""
    if instance.guid == None:
        instance.guid = uuid.uuid4().hex

pre_save.connect( add_loan_guid, sender=Loan )

Теперь, каждый раз, когда объект Loan сохраняется, но до его сохранения в базе данных, вызывается add_loan_guid (), и если экземпляр Loan не имеет набора guid, будет создан новый.

0 голосов
/ 29 октября 2010

Что-то еще привязывает Loan к None.Посмотрите дальше вниз, или, может быть, в другом модуле.Кроме того, вы не хотите type(self), поскольку это не удастся ни внукам, ни дальше.

...