2011-11-07 94 views
2

我想從postgres我的數據庫遷移到MySQL。以下是一個模型Customdata。django GenericForeignkey不能與object.create()一起工作,但工作正常與保存()

user = models.ForeignKey(User, related_name='customdatas') 
call_uuid = models.CharField(max_length=50, null=True, blank=True, editable=False) 
phone_number = models.CharField(max_length=15) 
name = models.CharField(max_length=50, db_index=True) 
type = models.CharField(max_length=10, choices=TYPE_CHOICES, 
     default='xml') 
appcode = models.CharField(max_length=10, choices=APPCODE_CHOICES, 
     null=True, blank=True) 
value = JSONField(default=[]) 
remark = models.TextField() 
timestamp = models.DateTimeField(auto_now_add=True) 
expiry_time = models.DateTimeField(null=True, blank=True, db_index=True) 
reference_type = models.ForeignKey(ContentType, null=True, blank=True) 
reference_id = UUIDField('Reference ID', null=True, blank=True) 
reference = generic.GenericForeignKey('reference_type', 'reference_id') 

當我創建使用下面的條目片斷我面對GenericForeignKey場「參考」的問題沒有得到更新。休息每個價值都很好。

>> c = Customdata.objects.create(call_uuid=session_uuid + '__'+ str(i), 
        user=order.user, name="voicemail", phone_number=phone_number, 
        type='url', value=data, remark=events['recordingFile'][i], 
        reference=order) 
>> c.reference 

[Blank value returned] 

但創建後,如果我執行更新,值被保存。

>> c.reference = order 
>> c.save() 
>> c.reference 
kdfj-kddl-3933kd-3ed8dl 

我不知道爲什麼「引用」字段沒有使用create保存,但在更新後再次正常工作。此代碼用於與postgres一起正常工作。

回答

0

我通過更改我的自定義UUIDField的pre_save函數解決了這個問題。

>> def pre_save(self, model_instance, add): 
>> old_val = getattr(model_instance, self.attname) 
>> if (self.primary_key and add) and (old_val is None or old_val==""): 
>>  value = str(uuid.uuid4()) 
>>  setattr(model_instance, self.attname, value) 
>>  return value 
>> else: 
>>  return old_val 

如果postgres沒有設置舊值,它會返回None,但在mysql的情況下它是「」。這是在創建和保存的情況下不同行爲的原因。

相關問題