开发者

Why is Loan undefined when type(self) works just fine?

The following code is being used by the admin to save a Loan object

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)

When I get to the super line, I get:

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

The save call is made from options.py line 597 and at that point obj is known to be a Loan object.

if I replace the super() l开发者_Go百科ine with

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

all is well. What is going on here?

The rest of the file is:

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)

So I don't see how anything is binding Loan to None


The Django developers offer a pattern for overriding the model save() method. Using that pattern, the implementation for your save() method should be:

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.

Let me offer a different approach: use signals!

Instead of trying to override the save() method, use a pre-save signal to initialize the guid field prior to the record being inserted/updated. Add the following code to your model.py file:

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 )

Now, any time that a Loan object is saved, but before it is persisted to the database, add_loan_guid() will be called, and if the Loan instance has no guid set, a new one will be created.


Something else is rebinding Loan to None. Look further down, or maybe in another module. Also, you don't want type(self) since that will fail for any grandchildren or further.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜