2011-11-07 3 views
2

postgres에서 mysql으로 마이 그 레이션을 시도하고 있습니다. 아래는 Customdata 모델입니다.django GenericForeignkey는 object.create()에서는 작동하지 않지만 save()에서는 제대로 작동합니다.

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') 

나는 아래 사용하여 항목을 작성하고 I 필드 "참조"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 

"참조"필드가 작성을 사용하여 저장되지 않고 다시 업데이트 된 이유는 알 수 없습니다. 이 코드는 포스트그레스와 잘 작동합니다.

답변

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 

이전 값이 없음으로 반환하지만 "이었다 MySQL의 경우 한 설정되지 않은 경우". 그리고 이것은 창조와 저장의 경우에 다른 행동의 이유였습니다.