Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:在生成pk/id之后和保存到数据库之前插入代码_Python_Django_Django Models_Initialization_Primary Key - Fatal编程技术网

Python Django:在生成pk/id之后和保存到数据库之前插入代码

Python Django:在生成pk/id之后和保存到数据库之前插入代码,python,django,django-models,initialization,primary-key,Python,Django,Django Models,Initialization,Primary Key,TL;DR:有没有办法在pk/id生成之后但在对象保存到db之前插入代码 你好,, 所以我现在正在复制django对象。我有一个复制函数,通过在对象的深层克隆上将pk和uid设置为None,在保存时强制生成新对象: def gen_uuid()->str: “”“返回uuid4的str表示形式”“” 返回str(uuid4()) 类条目(多态模型): “”“提供自定义锁定权限、名称和uid以替换Django的默认id DB列的基类。”“” uid=models.CharField( 唯一=正确,

TL;DR:有没有办法在pk/id生成之后但在对象保存到db之前插入代码

你好,, 所以我现在正在复制django对象。我有一个复制函数,通过在对象的深层克隆上将pk和uid设置为None,在保存时强制生成新对象:

def gen_uuid()->str:
“”“返回uuid4的str表示形式”“”
返回str(uuid4())
类条目(多态模型):
“”“提供自定义锁定权限、名称和uid以替换Django的默认id DB列的基类。”“”
uid=models.CharField(
唯一=正确,
主键=真,
db_index=True,
默认值=gen_uuid,
最大长度=36,
help_text=“对象的主键,无法强制执行,将随机生成。”
“示例:c8daa3ac-3dd0-44e9-ba2a-b0cbd1c8d8ae。”,
)
name=models.CharField(max_length=128,help_text=“对象名称”)
文件夹=models.ForeignKey(
文件夹,
在_delete=models.CASCADE上,
默认值=无,
空=真,
空白=真,
相关的_name=“文件”,
help_text=“包含对象的文件夹的主键。”,
)
content=JSONField(
default=dict,blank=True,help_text=“图形的JSON表示。”
)
def保存(自身、*args、**kwargs):
“”“处理条目保存和重复管理
此函数被重写,因此可以使用名称创建模型。
此函数不填充丢失的重复数字。
它将以这种模式创建副本:
条目名称
条目名称(2)
条目名称(3)
"""
#做一些事情。。。此函数中未调用duplicate()
return super().save(*args,**kwargs)
def副本(自身):
“”处理重复的行为
打算用作:entry.duplicate().save()
"""
如果不是self.pk和self.uid:
返回self.save()
#复制现有对象
复制=深度复制(自身)
duplicate.pk=duplicate.uid=None
返回副本
我有一个问题,在我的
内容
字段中,save函数中有生成的数据。
在这个
内容
元数据中有一个“uid”字段,我无法填充,因为它已被设置为无,而新的pk/uid尚未设置


有没有办法在pk/id生成之后但在对象保存到db之前插入代码?

信号可能会对您有所帮助。看看这里。我认为
pre_save
会对您有所帮助。问题是,pre save发生在save
save()
方法的开头,而pk是在返回
super()之后生成的。save(*args,**kwargs)
。我必须修改我的元数据post
return super().save(*args,**kwars)
,但在它进入数据库之前(尤其是在解析我的uid字段的
默认值之后)。也许
post_save
可以做到,但我想知道我的pk是否生成了。我通过强制使用uid(这不是我最初的目标)实现了我想要的功能,但到目前为止它仍然有效。我仍然想知道
default=
何时解决。无论如何,uuid的重复概率太低了(0.00000000006(6×10−11) )来担心它。如果您的项目不是需要高精度的关键项目,那么默认值就足够了