当我克隆一个django模型实例时,我习惯于清理'pk'字段.这似乎不适用于继承的模型:
拿着这个 :
class ModelA(models.Model):
info1 = models.CharField(max_length=64)
class ModelB(ModelA):
info2 = models.CharField(max_length=64)
class ModelC(ModelB):
info3 = models.CharField(max_length=64)
Run Code Online (Sandbox Code Playgroud)
现在让我们创建一个实例并按照"通常"的方式克隆它(我使用的是django shell):
In [1]: c=ModelC(info1="aaa",info2="bbb",info3="ccc")
In [2]: c.save()
In [3]: c.pk
Out[3]: 1L
In [4]: c.pk=None <------ to clone
In [5]: c.save() <------ should generate a new instance with a new index key
In [6]: c.pk
Out[6]: 1L <------ but don't
In [7]: ModelC.objects.all()
Out[7]: [<ModelC: ModelC object>] (only one instance !)
Run Code Online (Sandbox Code Playgroud)
我发现的唯一方法是:
In [16]: c.pk =None
In [17]: c.id=None
In [21]: …
Run Code Online (Sandbox Code Playgroud) 我有一个型号产品和相应的表格产品,我需要用5个产品来更新库存,所以我输入了产品的数据,并询问我想要存储多少项目,因为所有要保存的产品都是同样,除了Django默认ID,我想在视图中做这样的事情:
for i in range(0, 5):
form.save()
Run Code Online (Sandbox Code Playgroud)
不幸的是,这只保存了最后一个表格
我怎么能达到我的需要呢?
我有一个模型目标,它有两个M2M字段,并由另一个模型事件引用.现在,要求是目标是可编辑的,这意味着我可以从M2M字段添加/删除并添加/删除事件.但是编辑会经过审核,只有在批准后才会反映出更改,或者在拒绝的情况下,必须还原更改.
我已经通过深度扫描,但它不符合我的目的,因为我可以说如果x=deepcopy(goal object)
我得到目标对象的副本,但我不确定我能用它做什么.
然后我从django.forms模块了解了model_to_dict,它序列化了整个对象,这很方便.我想可能是我可以使用这个字典创建一个原始目标为外键的模型RevisedGoal.这是可行的解决方案吗?有没有办法实现这个目标?
我需要为特定模型查询一组对象,更改单个属性/列(“帐户”),然后将整个查询集的对象保存为新对象/行。换句话说,我想复制对象,并在重复项上更改单个属性(“帐户”)。我基本上是创建一个新帐户,然后遍历每个模型并将以前帐户的对象复制到新帐户,因此我将使用不同的模型重复执行此操作,可能使用 django shell。我应该如何处理这个问题?可以在查询集级别完成还是需要遍历所有对象?
IE,
MyModel.objects.filter(account="acct_1")
# Now I need to set account = "acct_2" for the entire queryset,
# and save as new rows in the database
Run Code Online (Sandbox Code Playgroud) 最好用例子来描述:
看法:
def my_view(request):
obj_old = Inventories.objects.get(id = source_id)
obj_new = obj_old
obj_old.some_field = 0
obj_old.save()
obj_new.some_field = 1
obj_new.id = None
obj_new.save()
Run Code Online (Sandbox Code Playgroud)
问题是,我做出obj_new的变化也适用于obj_old
使的值some_field
是1两obj_old
和obj_new
。任何想法如何解决这一问题 ?