Raunak Agarwal
Raunak Agarwal

Reputation: 7228

Django Application: Foreign Key pointing to an abstract class

I am trying to design a framework to help implement complex web flows. The framework would provide with abstract classes which could inherited and implemented by the sub-apps. Now, as you can see my abstract class Action has a Foreign Key with Stage. Since, it has a foreignkey it could not be made abstract due to which it would have its own table. So, If I have 2 implementing application then my first application can see all the Stages for itself as well as for the other application. I could make some tweaks in the queries to avoid this. But I want to know if there is solution so, that my implementing Action class could directly point to the Inheriting Stage class.

parent_app/models.py

class Stage(models.Model):
   name = models.CharField(max_length=255)

class Action(models.Model):
    stage = models.ForeignKey(Stage)
    class Meta:
       abstract = True

sub_app1/models.py

class StageImpl1(Stage):
    pass

class ActionImpl1(Action):
    ...

sub_app2/models.py

class StageImpl2(Stage):
    pass

class ActionImpl2(Action):
    ...

Update:

The current situation is:

ActionImpl1 has a foreignkey to Stage

What I would to have is:

ActionImpl1 to have a foreignkey with StageImpl1

Upvotes: 3

Views: 3835

Answers (2)

Reinout van Rees
Reinout van Rees

Reputation: 13624

An abstract class is a class that doesn't exist. It is used as a basis for other classes. It is never never ever initialized.

Something that does not exist cannot have a foreign key pointing at it!

Something to look at, if you want to have a way to point at several different kinds of classes: generic relations. This is Django's build-in way to have something that looks like a foreign key point at a number of different objects.

Upvotes: 7

fdisk
fdisk

Reputation: 233

It is imposible. Think what would happen to all the classes with a foreign key pointing A if A is abtract and several classes inherit from A.

I dont know your requirements but I maybe you should consider using multitable inheritance, and point the FK to the parent table.

From the Django documentation:

Multi-table inheritance

https://docs.djangoproject.com/en/dev/topics/db/models/#multi-table-inheritance

The second type of model inheritance supported by Django is when each model in the hierarchy is a model all by itself. Each model corresponds to its own database table and can be queried and created individually. The inheritance relationship introduces links between the child model and each of its parents (via an automatically-created OneToOneField). For example:

Upvotes: 2

Related Questions