Django模型实例的副本以及相关的一对一字段

时间:2015-07-23 04:00:23

标签: python django

如何创建Django模型实例的副本以及相关的一对一字段?

复制模型实例工作正常,但是当我尝试创建一对一模型的副本时,该模型的所有字段都变为空白。这就是我的所作所为:

            new_address = self.object.designer.address # type Address
            new_address.pk = None
            new_address.save()

            new_contact = self.object.designer # type Contact
            new_contact.pk = None
            new_contact.address = new_address

            new_contact.save()

            self.object.shippinginfo.contact = new_contact
            self.object.shippinginfo.save()

Contact模型与Address模型具有一对一的关系。我尝试打印出值,在创建新地址后,当我打印出来时值正确,但是当我将地址保存到新联系人的地址字段时,地址的所有字段都是空白的,除了PK ...

2 个答案:

答案 0 :(得分:0)

我认为你不清楚如何定义关系。如果Contact模型与Address模型具有一对一关系,则Contact类的一个对象可以与Address模型的一个对象相关联。它被定义为:

class Contact(models.Model):
    # field_one = ...
    # field_two = ...
    # and so on...

class Address(models.Model):
    contact = OneToOneField(Contact)
    # and more model fields...

这样,您可以将一个Contact对象关联到一个Address对象。如果您希望为一个联系人提供多个地址,则应使用ForeignKey

对于与许多Address实例相关的一个Contact对象,您可以将关系定义为:

class Contact(models.Model):
   # field_one = ...
   # field_two = ...
   # and so on...

class Address(models.Model):
    contact = ForeignKey(Contact)
    # and more fields...

但是这里的Address对象只能与特定的Contact对象相关联。

您可以在此处阅读Many To Many realtionship

您不必初始化pk字段,因为它会自动更新/添加。

答案 1 :(得分:0)

要回答您的直接问题,您可能需要使用save(force_insert=True)功能,看看是否可以修复它。如果您拨打Contact.objects.all().count()并且地址相同,我也会检查您得到的内容,这样您就可以确保添加新记录。

那就是说,我个人会建议反对你要做的事情,在我的书中,这是一个黑客。相反,只需编写一些额外的代码行,并使用其他记录中设置的字段正确调用Adress.objects.create()Contact.objects.create。 e.g。

old_address = self.object.designer.address
new_address = Address.objects.create(line1=old_adress.line1, line2=old_address.line2, etc)

甚至更好,使用AddressManager

class AddressManager(models.Manager):
    def create_copy(self, obj):
        address = self.create(line1=obj.line1, etc.)
        return address

class ContactManager(models.Manager):
    def create_copy(self, obj):
        new_address = Address.objects.create_copy(obj.address)
        contact = self.create(name=obj.name, address=new_address, etc.)
        return contact

new_contact = Contact.objects.create_copy(old_contact)

希望这有帮助。