2014-02-08 83 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。而且這個字段必須是一個主鍵,因爲數據庫中的優化和一致性 –