Yeo
Yeo

Reputation: 11794

How to use Django Proxy Model given a django model object or queryset

I have 2 questions regarding proxy from model,

  1. How to create a proxy object from model object?
  2. How to create a proxy QuerySet from model QuerySet?

For example, assume we have defined:

from django.contrib.auth.models import User

class MyProxyUser(User):
    class Meta:
        proxy = True

    def say_hello(self):
        return "Hello, {}".format(self.get_full_name())

One way to convert successfully is by re-querying the object, which is unnecessary.

# Retrieve from model Object.
# Assume: request is HttpRequest from authenticated user.
my_user = MyProxyUser.objects.get(pk=request.user.pk) # Hit Database
my_user.say_hello()


# Retrieve from model QuerySet.
# Assume: users = User.objects.all()
MyProxyUser.objects.filter(pk__in=users)

Upvotes: 3

Views: 6891

Answers (2)

Ramast
Ramast

Reputation: 7719

You just need to assign the model attribute of your queryset

users = User.objects.all()
users.model = MyProxyUser
users.first().say_hello()

Edit: For assigning proxy class to a django model object, try

    user = User.objects.all()
    user.__class__ = MyProxyUser

Upvotes: 4

Joe Sadoski
Joe Sadoski

Reputation: 676

Adding to Ramast's answer, you can also build a function on your proxy model class to consistently do this for you:

class MyProxyUser(User):
...
    @staticmethod
    def from_user(user: UserManager):
        """ Get a PAUser classed instance from a User object.

        Useful for Signals and other Django defaults that send base User objects.
        """
        user.model = PAUser
        return user
...

Upvotes: 0

Related Questions