Django模型保存self.field.rel.to.DoesNotExist

时间:2013-06-04 09:45:38

标签: python django django-models

我发现了几次(onetwo)人们做同样的事情:

class TempUser(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)
    bank_account = models.ForeignKey(BankAccount)

    def save(self, *args, **kwargs):
        if not self.bank_account:
            bank_account = BankAccount()
            bank_account.save()
            self.bank_account = bank_account
        super(TempUser, self).save(*args, **kwargs)

但我得到了下一个例外:

 File "models.py", line 134, in main
    fill_predefined_data()
  File "models.py", line 121, in fill_predefined_data
    user.save()
  File "models.py", line 41, in save
    if not self.bank_account:
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/related.py", line 343, in __get__
    raise self.field.rel.to.DoesNotExist
__main__.DoesNotExist

4 个答案:

答案 0 :(得分:3)

您可以更改TempUser模型

bank_account = models.ForeignKey(BankAccount, null=True)

或将您的病情改为:

if not hasattr(self, 'bank_account'):

答案 1 :(得分:0)

不确定,但可能问题在于TempUser尚未创建。

您可以做的一件事是使用pre_save (look here)post_save并在其中创建BankAccount

或者您可以使用TempUser实际保存commit=False,将BankAccount克里特保存,然后保存TempUser

答案 2 :(得分:0)

我不确定为什么你认为这些链接中的任何一个是相关的。它们都访问模型上的正常字段 - id和char字段。您正在访问ForeignKey,它当然是对可能存在或可能不存在的另一个模型实例的引用。在你的情况下,它显然不存在。

最简单的方法是检查FK id而不是实际对象:

    if not self.bank_account_id:
        bank_account = BankAccount()
        bank_account.save()
        self.bank_account = bank_account

答案 3 :(得分:0)

似乎没有创建bank_account。 您在BankAccount中有任何必填字段吗?