django GenericForeignkey не работает с object.create (), но отлично работает с save () - PullRequest
2 голосов
/ 07 ноября 2011

Я пытаюсь перенести мою базу данных из postgres в mysql.Ниже представлена ​​модель Customdata.

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.

1 Ответ

0 голосов
/ 23 ноября 2011

Я решил проблему, изменив функцию pre_save моего пользовательского UUIDField.

>> 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 это было "".И это было причиной различного поведения в случае создания и сохранения.

...