在Django中将模型对象从模型复制到另一个模型

The*_*one 6 django django-models

我必须建模.我想将模型对象从模型复制到另一个:Model2是Model1的副本(此模型有太多m2m字段)Model1:

class Profile(models.Model):
      user = models.OneToOneField(User)
      car = models.ManyToManyField(Car)
      job = models.ManyToManyField(Job)
      .
      .
Run Code Online (Sandbox Code Playgroud)

这是一个调查应用程序.我想在他/她参加调查时保存用户的个人资料(因为他可以在调查后编辑个人资料)我创建了另一个模型来保存用户个人资料(我不确定它是正确的方式)

class SurveyProfile(models.Model):
      user = models.OneToOneField(SurveyUser) #this is another model that takes survey users
      car = models.ManyToManyField(Car)
      job = models.ManyToManyField(Job)
Run Code Online (Sandbox Code Playgroud)

如何将用户配置文件从Profile复制到SurveyProfile.

提前致谢

Ste*_*lim 10

deepcopy 等等不起作用,因为类/模型是不同的.

如果您确定*中SurveyProfile包含所有字段Profile,则应该可以使用(未​​测试):

for field in instance_of_model_a._meta.fields:
    if field.primary_key == True:
        continue  # don't want to clone the PK
    setattr(instance_of_model_b, field.name, getattr(instance_of_model_a, field.name))
instance_of_model_b.save()
Run Code Online (Sandbox Code Playgroud)

*(在这种情况下,我建议你做一个抽象ProfileBase类,并继承作为一个具体类ProfileSurveyProfile,但是这并不影响什么我上面放)

  • 您可能想要检查`field.name`是不是id,您不想复制id. (2认同)

Jam*_*s R 3

我很难理解你上面写的内容,因此我不能 100% 确定这是否有效,但如果我理解正确的话,我想我会做这样的事情:

class Model2Form(ModelForm):
    class Meta:
        model = models.Model2
Run Code Online (Sandbox Code Playgroud)

进而

f = Model2Form(**m1.__dict__)
if f.is_valid():
    f.save()
Run Code Online (Sandbox Code Playgroud)

但我认为这看起来更像是糟糕的数据库设计,没有看到整个模型,我无法确定。但是,无论如何,当您可以简单地在模型级别使用继承或其他方法来获得相同的行为时,我不确定您为什么要这样做。