2011-11-07 91 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的情况下它是“”。这是在创建和保存的情况下不同行为的原因。

相关问题