2011-09-01 7 views
6

Próbuję utworzyć mapowanie ORM Django, które jest zgodne z istniejącym data model, więc staram się pracować z istniejącym zestawem tabeli i kolumny nazwy.Dziedziczenie wielu tabel Django: określ niestandardową kolumnę jeden-do-jednego

Mam sytuacji dziedziczenia wielu tabel, gdzie klasa InformationObject pochodzi z klasy Object. Chciałbym pozwolić Django obsłużyć to zwykły sposób:

class Object(models.Model): 
    class Meta: 
     db_table = "object"   

class InformationObject(Object): 
    class Meta: 
     db_table = "information_object" 

W tym przypadku Django automatycznie utworzyć pole typu jeden-do-jednego modelu dziedziczenie zwanego object_ptr_id. Jednak w schemacie, do którego jestem zmuszony użyć, odniesienie do obiektu nazywa się po prostu "id". A więc:

Czy istnieje sposób, aby w jakikolwiek sposób określić nazwę kolumny, którą Django automatycznie używa do dziedziczenia wielu tabel?

Alternatywa, które będę musiał wykorzystać w inny sposób, jest użycie wyraźne pole typu jeden-do-jednego, ale wtedy nie będzie mógł dziedziczyć metody non-bazy danych z modelu obiektowego:

class Object(models.Model): 
    class Meta: 
     db_table = "object"   

class InformationObject(models.Model): 
    class Meta: 
     db_table = "information_object" 
    id = models.OneToOneField(Object, primary_key=True, db_column="id") 

Wszelkie pomysły? Może mógłbym utworzyć wspólną dla nich klasę bazową i umieścić tam metody inne niż db ...?

+0

Twój ostatni pomysł jest całkiem solidne: stworzyć wspólną klasę bazową dla obu z nich i używać go jako wstawek, aby zapewnić dodatkową funkcjonalność, której szukasz . Proponuję spróbować jako eksperyment. (Może się nie udać, warstwa bazy danych Django robi całkiem fajne rzeczy z metaclami Pythona, ale warto spróbować.) –

Odpowiedz

8

Z (wersji rozwojowej) django docs:

Jak wspomniano, Django automatycznie utworzy OneToOneField łączący swoją klasę dziecko z powrotem bez żadnych abstrakcyjnych modeli nadrzędnych. Jeśli chcesz kontrolować nazwę atrybutu łączącego się z rodzicem, możesz utworzyć własny OneToOneField i ustawić parent_link = True, aby wskazać, że twoje pole jest linkiem do klasy nadrzędnej.

1

Jak wspomniano w @fusion cytując z dokumentów, będziesz musiał utworzyć OneToOneField, jeśli chcesz określić kolumnę, podczas korzystania z dziedziczenia modelu. Dziedziczone pola będą dostępne w klasie potomnej zarówno w zakresie własnym, jak i w polu jeden do jednego.

class Object(models.Model): 
    class Meta: 
     db_table = "object" 
    column_1 = models.CharField() 

class InformationObject(Object): 
    class Meta: 
     db_table = "information_object" 
    # arbitrary property name (parent_link) 
    parent_link = models.OneToOneField(Object, primary_key=True, db_column="id", parent_link=True) 

w poniższym przykładzie:

>>> inf_obj = InformationObject.objects.get(pk=1) 
>>> print inf_obj.column_1 == inf_obj.parent_link.column_1 
True 
Powiązane problemy