簡體   English   中英

Django模型實例的副本以及相關的一對一字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM