Wiem, że to dużo później, ale musiałem zrobić coś podobnego i nie mogłem znaleźć wiele. Znalazłem odpowiedź ukrytą w jakimś kodzie źródłowym here, ale napisałem również przykładową metodę klasy, która byłaby wystarczająca.
class AfricanSwallow(Swallow):
@classmethod
def save_child_from_parent(cls, swallow, new_attrs):
"""
Inputs:
- swallow: instance of Swallow we want to create into AfricanSwallow
- new_attrs: dictionary of new attributes for AfricanSwallow
Adapted from:
https://github.com/lsaffre/lino/blob/master/lino/utils/mti.py
"""
parent_link_field = AfricanSwallow._meta.parents.get(swallow.__class__, None)
new_attrs[parent_link_field.name] = swallow
for field in swallow._meta.fields:
new_attrs[field.name] = getattr(swallow, field.name)
s = AfricanSwallow(**new_attrs)
s.save()
return s
Nie mogłem się dowiedzieć, jak uzyskać zatwierdzenie formularza do pracy z tą metodą; więc z pewnością można by poprawić więcej; Prawdopodobnie oznacza to, że refaktoryzacja bazy danych może być najlepszym długoterminowym rozwiązaniem ...
Hej - wspaniała odpowiedź. Minęło trochę czasu, odkąd miałem taką potrzebę. Oczywiście jestem trochę niechętny do polegania na _meta w sytuacji produkcyjnej, ale takie jest życie. Dzięki! – jMyles