jazzband / django-polymorphic

Improved Django model inheritance with automatic downcasting
https://django-polymorphic.readthedocs.io
Other
1.65k stars 279 forks source link

Proxy Model Support - Creating base class and querying for proxy model does not return results #390

Open Eluzive opened 5 years ago

Eluzive commented 5 years ago

Hello,

First off thanks for creating this package!

I am running into an issue now where we needed to create two different admin pages and creating proxy models seems like a good idea to use the same model have this separation or grouping. However, when registering the proxy models to their own separate ModelAdmins, the get_queryset() returns an empty set and results are not shown.

I've posted on SO

When I tried creating the object using the regular Django Model class, I am able to query the proxy model and get the created object.

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

class MyPerson(Person):
    class Meta:
        proxy = True

    def do_something(self):
        # ...
        pass
>>> p = Person.objects.create(first_name="foobar")
>>> p
<Person: Person object (4)>
>>> MyPerson.objects.all()
<QuerySet [<MyPerson: MyPerson object (4)>]>

However, when I use the PolymorphicModel and query for proxy model, the queryset is empty.


class Person(PolymorphicModel):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
>>> p = Person.objects.create(first_name="foobar")
>>> MyPerson.objects.all()
<PolymorphicQuerySet []>

Shouldn't we expect the Queryset to contain the Person object we created?

thejpanganiban commented 4 years ago

We're also encountering this issue. :(

Any updates on this?

ParikhKadam commented 3 years ago

Any updates??

emyller commented 2 years ago

This is by design. For now you can work around this by overriding the manager's get_queryset:

class MyModelManager(PolymorphicManager):
    def get_queryset(self):
        qs = self.queryset_class(self.model, using=self._db, hints=self._hints)
        return qs

class MyModel(models.Usuario):
    objects = MyModelManager()

    class Meta:
        proxy = True