/ / Django Multi-table inheritance: specifica il nome personalizzato della colonna one-to-one - django, ereditarietà, multi-tabella

Django Multi-table inheritance: specifica il nome personalizzato della colonna one-to-one - django, ereditarietà, multi-tabella

Sto cercando di creare una mappatura ORM di Django compatibile con una esistente modello di dati, quindi sto cercando di lavorare con un set esistente di nomi di tabelle e colonne.

Ho una situazione di ereditarietà a più tabelle in cui una classe InformationObject deriva da Object di classe. Mi piacerebbe che Django gestisse questo modo nel solito modo:

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

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

In questo caso Django creerebbe automaticamente un campo one-to-one sul modello ereditario chiamato object_ptr_id. Tuttavia, sullo schema che sono limitato a utilizzare, il riferimento all'oggetto è semplicemente chiamato "id".

C'è un modo per specificare in qualche modo il nome della colonna che Django utilizza auto-magicamente per l'ereditarietà multi-tavolo?

L'alternativa, che dovrò usare altrimenti, è di usare un campo esplicito one-to-one, ma poi non sarò in grado di ereditare metodi non-database dal modello Object:

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")

Qualche idea? Forse potrei creare una classe base comune per entrambi e mettere lì i metodi non-db ...?

risposte:

8 per risposta № 1

Dal documenti django (versione di sviluppo):

Come accennato, Django creerà automaticamente unOneToOneField che collega la classe figlia a qualsiasi modello padre non astratto. Se si desidera controllare il nome dell'attributo che rimanda al genitore, è possibile creare il proprio OneToOneField e impostare parent_link = True per indicare che il proprio campo è il collegamento alla classe genitore.


1 per risposta № 2

Come menzionato da @fusion citando dai documenti,dovrai creare un OneToOneField se vuoi specificare la colonna, mentre usi l'ereditarietà del modello. I campi ereditati saranno disponibili nella classe child sia nell'autoscatto sia nel campo one-to-one.

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)

In questo esempio:

>>> inf_obj = InformationObject.objects.get(pk=1)
>>> print inf_obj.column_1 == inf_obj.parent_link.column_1
True