Django4.0 執(zhí)行查詢-復(fù)制模型實(shí)例

2022-03-16 17:33 更新

盡管沒有用于復(fù)制模型實(shí)例的內(nèi)置方法,但可以輕松地創(chuàng)建復(fù)制所有字段值的新實(shí)例。在最簡(jiǎn)單的情況下,您可以將 ?pk ?設(shè)置為 ?None ?并將 ?_state.adding? 設(shè)置為 ?True?。使用我們的博客示例:

blog = Blog(name='My blog', tagline='Blogging is easy')
blog.save() # blog.pk == 1

blog.pk = None
blog._state.adding = True
blog.save() # blog.pk == 2

若你使用了集成,事情會(huì)更復(fù)雜??紤]下 ?Blog ?的一個(gè)子類:

class ThemeBlog(Blog):
    theme = models.CharField(max_length=200)

django_blog = ThemeBlog(name='Django', tagline='Django is easy', theme='python')
django_blog.save() # django_blog.pk == 3

由于繼承的工作原理,您必須將 ?pk ?和 ?id ?都設(shè)置為 ?None?,并將 ?_state.adding? 設(shè)置為 ?True?:

django_blog.pk = None
django_blog.id = None
django_blog._state.adding = True
django_blog.save() # django_blog.pk == 4

該方法不會(huì)拷貝不是模型數(shù)據(jù)表中的關(guān)聯(lián)關(guān)系。例如, ?Entry ?有一個(gè)對(duì) ?Author ?的 ?ManyToManyField ?關(guān)聯(lián)關(guān)系。在復(fù)制條目后,你必須為新條目設(shè)置多對(duì)多關(guān)聯(lián)關(guān)系。

entry = Entry.objects.all()[0] # some previous entry
old_authors = entry.authors.all()
entry.pk = None
entry._state.adding = True
entry.save()
entry.authors.set(old_authors)

對(duì)于 ?OneToOneField ?關(guān)聯(lián),你必須拷貝關(guān)聯(lián)對(duì)象,并將其指定給新對(duì)象的關(guān)聯(lián)字段,避免違反一對(duì)一唯一性約束。例如,指定前文復(fù)制的 ?entry?:

detail = EntryDetail.objects.all()[0]
detail.pk = None
detail._state.adding = True
detail.entry = entry
detail.save()


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)