2011-08-27 73 views
2

Django新手在这里。我有两个简单的模式是这样的:外键和IntegrityError:ID可能不是NULL

class Fluff(models.Model): 
    # .... 
    # some fields definitions 

class Something(models.Model): 
    name = models.CharField(max_length=200) 
    fluff = models.ForeignKey(Fluff) 

syncdb去如预期,然后我去了壳测试的东西:

>>> s = Something() 
>>> s.name = 'Blah' 
>>> s.fluff = Fluff(...) 
>>> s.save() 
Traceback (most recent call last): # traceback skipped for brevity 
IntegrityError: app_something.fluff_id may not be NULL 

我希望Django的做它的魔力,弄清楚fluff是没有保存,然后在保存之前保存s。这并没有发生,但没关系,我可以节省fluff我自己,让我们再试一次:

>>> s = Something() 
>>> s.name = 'Blah' 
>>> s.fluff = Fluff(...) 
>>> s.fluff.save() 
>>> s.save() 
Traceback (most recent call last): # traceback skipped for brevity 
IntegrityError: app_something.fluff_id may not be NULL 

没有运气。这应该是微不足道的,但我目前无法弄清楚。任何帮助,将不胜感激。

回答

2

尝试做这样的事情:

>>> s.name = 'Blah' 
>>> obj = Fluff(...) 
>>> obj.save() 
>>> s.fluff = obj 
>>> s.save() 
+0

OK,那工作......但是这是做事的习惯呢?似乎对我很笨拙。特别是因为在我的场景中,我想生成一些'Something's,并且只根据用户输入保存一些。我可以看到,导致像's.fluff = s.fluff'这样的行,所以我不会随着's'携带额外的变量... – sbk

+1

我只是认为它会起作用。在将其分配给其他模型的字段之前,您需要获取或创建对象。理解代码中发生的事情非常容易,所以我认为这是很好的方法。真的,我不看模型系统,但我想当你使用s.fluff = Fluff(...) - 只有在数据库(整数)的字段中设置的id,所以你可以保存它。 – Dracontis

+0

是的,我可以想象为什么你的代码工作,而我的代码不工作;这并不意味着我必须喜欢它:)无论如何,感谢您的时间,我会稍等一会才接受您的答案,以防万一其他建议弹出。 – sbk

相关问题