The main Usage of a proxy model is to override the main functionality of existing Model. It is a type of model inheritance without creating a new table in Database. It always query on original model with overridden methods or managers.
You can query, delete, edit, create etc on Proxy model but the effects will be on the original model.
You can define models as a proxy just by adding proxy = True in Meta class of model.
# Original Model class Employee(models.Model): EmployeeType = ( ("D", "Developer"), ("M", "Manager"), ) name = models.CharField(max_length=55) type = models.CharField(choices=EmployeeType, max_length=1, default='D') def __str__(self): return self.name # Model manager to use in Proxy model class ManagerEmpManager(models.Manager): def get_queryset(self): return super(ManagerEmpManager, self).get_queryset().filter( type='M') def create(self, **kwargs): kwargs.update({'type': 'M'}) return super(ManagerEmpManager, self).create(**kwargs) # Proxy Model class ManagerEmployee(Employee): objects = ManagerEmpManager() class Meta: proxy = True
In ManagerEmployee I have overridden create method to set type as M(or Manager). whenever you create an object for ManagerEmployee model the type will be set to 'M' and a new object will be created for Employee table. Whenever you query on ManagerEmpManager you will get all employees who are Managers(or type field as 'M').
In [1]: from AppName.models import Employee, ManagerEmployee In [2]: e1 = Employee.objects.create(name="Monkey") In [3]: e1 Out[3]: <Employee: Monkey> # Employee object created with type 'D' In [4]: e1.type Out[4]: u'D' In [2]: e2 = ManagerEmployee.objects.create(name="Cow") In [6]: e2 Out[6]: <ManagerEmployee: Cow> # object created with type 'M' for model ManagerEmployee(original model Employee) In [3]: e2.type Out[3]: u'M' In [4]: ManagerEmployee.objects.all() # To get all ManagerEmployee objects(or type 'M') as we defined in ManagerEmpManager class. Out[4]: <QuerySet [<ManagerEmployee: Cow>]> In [5]: Employee.objects.all() Out[5]: <QuerySet [<Employee: Monkey>, <Employee: Cow>]>
Register ManagerEmployee model in admin.py file to get a separate interface for ManagersEmployee model.
Micropyramid is a software development and cloud consulting partner for enterprise businesses across the world. We work on python, Django, Salesforce, Angular, Reactjs, React Native, MySQL, PostgreSQL, Docker, Linux, Ansible, git, amazon web services. We are Amazon and salesforce consulting partner with 5 years of cloud architect experience. We develop e-commerce, retail, banking, machine learning, CMS, CRM web and mobile applications.
Django-CRM :Customer relationship management based on Django
Django-blog-it : django blog with complete customization and ready to use with one click installer Edit
Django-webpacker : A django compressor tool
Django-MFA : Multi Factor Authentication
Docker-box : Web Interface to manage full blown docker containers and images
More...