如何创建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 ...
答案 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)
希望这有帮助。