[英]How to create multiple instance for one-to-one field in django from base model inheritance?
[英]copy of a Django model instance along with a related One-to-One field
如何創建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()
聯系人模型與地址模型具有一對一的關系。 在創建新地址后,我嘗試打印出這些值,當我將它們打印出時,這些值是正確的,但是當我將地址保存到新聯系人的地址字段中時,該地址的所有字段均為空白PK ...
我認為您不清楚如何定義關系。 如果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...
但是,這里的地址對象只能與特定的聯系人對象關聯。
您可以在此處閱讀有關多對多房地產的信息。
而且您不必初始化pk
字段,因為它會自動更新/添加。
要回答您的直接問題,您可能需要使用save(force_insert=True)
函數,看看是否可以解決該問題。 我還將檢查如果您調用Contact.objects.all().count()
會得到什么,並且對Address也是如此,那么您可以確保添加新記錄。
就是說,我個人會建議您不要嘗試做的事,在我的書中,這是hack。 相反,只需編寫一些額外的代碼行,並使用其他記錄中設置的字段正確調用Adress.objects.create()
和Contact.objects.create
。 例如
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)
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.