Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

django abstract models versus regular inheritance

Besides the syntax, what's the difference between using a django abstract model and using plain Python inheritance with django models? Pros and cons?

UPDATE: I think my question was misunderstood and I received responses for the difference between an abstract model and a class that inherits from django.db.models.Model. I actually want to know the difference between a model class that inherits from a django abstract class (Meta: abstract = True) and a plain Python class that inherits from say, 'object' (and not models.Model).

Here is an example:

class User(object):    first_name = models.CharField(..     def get_username(self):        return self.username  class User(models.Model):    first_name = models.CharField(...     def get_username(self):        return self.username     class Meta:        abstract = True  class Employee(User):    title = models.CharField(... 
like image 308
rpq Avatar asked May 20 '13 17:05

rpq


1 Answers

I actually want to know the difference between a model class that inherits from a django abstract class (Meta: abstract = True) and a plain Python class that inherits from say, 'object' (and not models.Model).

Django will only generate tables for subclasses of models.Model, so the former...

class User(models.Model):    first_name = models.CharField(max_length=255)     def get_username(self):        return self.username     class Meta:        abstract = True  class Employee(User):    title = models.CharField(max_length=255) 

...will cause a single table to be generated, along the lines of...

CREATE TABLE myapp_employee (     id         INT          NOT NULL AUTO_INCREMENT,     first_name VARCHAR(255) NOT NULL,     title      VARCHAR(255) NOT NULL,     PRIMARY KEY (id) ); 

...whereas the latter...

class User(object):    first_name = models.CharField(max_length=255)     def get_username(self):        return self.username  class Employee(User):    title = models.CharField(max_length=255) 

...won't cause any tables to be generated.

You could use multiple inheritance to do something like this...

class User(object):    first_name = models.CharField(max_length=255)     def get_username(self):        return self.username  class Employee(User, models.Model):    title = models.CharField(max_length=255) 

...which would create a table, but it will ignore the fields defined in the User class, so you'll end up with a table like this...

CREATE TABLE myapp_employee (     id         INT          NOT NULL AUTO_INCREMENT,     title      VARCHAR(255) NOT NULL,     PRIMARY KEY (id) ); 
like image 196
Aya Avatar answered Oct 02 '22 18:10

Aya