4
votes

I would like to create a models.Model class that doesn't became part of the database but just an interface to other models (I want to avoid repeating code).

Something like that:

class Interface(models.Model):
    a = models.IntegerField()
    b = models.TextField()

class Foo(Interface):
    c = models.IntegerField()

class Bar(Interface):
    d = models.CharField(max_length='255')

So my database should have only Foo (with a,b,c collumns) and Bar (with a,b,d) but not the table Interface.

2

2 Answers

11
votes

"Abstract base classes"

Abstract base classes are useful when you want to put some common information into a number of other models. You write your base class and put abstract=True in the Meta class. This model will then not be used to create any database table. Instead, when it is used as a base class for other models, its fields will be added to those of the child class.

1
votes

You can define your classes like this:

from django.db import models

class CommonInfo(models.Model):
    name = models.CharField(max_length=100)
    age = models.PositiveIntegerField()

    class Meta:
        abstract = True

class Student(CommonInfo):
    home_group = models.CharField(max_length=5)