2014-02-08 82 views
0

所以我有以下型号:Django的自定义保存不工作

class Info(models.Model): 
    user_id = models.BigIntegerField(primary_key=True) 
    #... 
    def save(self,*args,**kwargs): 
     print 1 
     is_created = False 
     if not self.pk: 
      print 2 
      is_created = True 
     super(Info, self).save(*args, **kwargs) 
     print 3 
     if is_created: 
      print 4 
      signals.info_created.send(sender=self.__class__,info=self) 

现在我有这些打印语句来跟踪什么on.when去的我无论是运行或Info.create(...)

info = Info(...) 
info.save() 

我得到以下输出:

1 
3 

这表明if not self.pk语句评估为f ALSE。现在我假设这是因为我有一个自定义的主键需要在创建该对象时给出。所以这里是我的问题:是我的假设是否正确?无论是否是,我怎样才能得到这个自定义保存合作?

回答

1

在base.py型号:上USER_ID

def _get_pk_val(self, meta=None): 
    if not meta: 
     meta = self._meta 
    return getattr(self, meta.pk.attname) 

meta.pk点,元调用创建或保存

class Info(models.Model): 
    user_id = models.BigIntegerField(primary_key=True) 
    text = models.TextField() 

    def save(self,*args,**kwargs): 
     print 1 
     is_created = False 
     if not self.pk: 
      print 2 
      is_created = True 

     self.pk = 20 #set pk before super call to pass validation 

     super(Info, self).save(*args, **kwargs) 
     print 3 
     if is_created: 
      print 4 


Info.objects.create(text='wew') 
#prints 1 2 3 4 
+0

这是我之前的预期从构造kwargs填补。请注意,我的问题有两个部分,请回答第二个 –

+0

也许尝试使用BigIntegerField(unique = True)? – vadimchin

+0

所以这不回答我的问题。我的问题是,当我需要评估为True时,'if not self.pk'这一行评估为false。而且这个字段必须是一个主键,因为数据库中的优化和一致性 –