【问题标题】:django GenericForeignkey does not work with object.create() but work fine with save()django GenericForeignkey 不适用于 object.create() 但适用于 save()
【发布时间】:2011-11-07 09:23:49
【问题描述】:

我正在尝试将我的数据库从 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')

当我使用下面的 sn-p 创建条目时,我遇到了一个问题,即 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。

【问题讨论】:

    标签: django django-models generic-foreign-key


    【解决方案1】:

    我通过更改自定义 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 的情况下,它是“”。这就是创建和保存时行为不同的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-05
      • 1970-01-01
      • 2011-12-02
      • 2018-03-06
      • 2013-03-02
      • 2021-01-08
      • 2014-08-16
      • 1970-01-01
      相关资源
      最近更新 更多