How is the following data structure best represented in a set of Django database models:
Top level element
An unknown number n of Mid level element(s), n >= 1
Low level element
For example:
Top
Mid
Mid
Mid
Bottom
or
Top
Mid
Bottom
The issue is that the model for the Mid-level element cannot have both a Mid-level element and a Top-level element as parents. The solutions I can think of are:
Two foreign keys in the Mid-level model
The mid-level model can have a foreign key relationship with Top
and another one with 'self'
. This seems hacky because if you want to move down through the layers, you have to check both keys at each layer - when you know that only the first Mid
has a relationship with Top
, while everything else has a relationship with Mid
.
class Mid(models.Model):
top_parent = models.ForeignKey(Top, blank=True, null=True)
mid_parent = models.ForeignKey('self')
Make Top an instance of Mid instead
Eliminate Top
altogether so that Mid
s always link to other Mid
s. The issue with this solution is that Top
has some unique properties that I don't want to add to Mid
if it can be avoided.
Use generic relations
Use generic relations so that Mid
can link to both Top
and Mid
. The downside is that this adds a lot of complexity to the code.
Here's a related question I found a bit later: Django: How do I model a tree of heterogeneous data types?