jazzband/django-model-utils

QueryManager constraints don't apply to RelatedManagers

Open

#31 ouverte le 15 mars 2013

Voir sur GitHub
 (7 commentaires) (0 réactions) (0 assignés)Python (370 forks)github user discovery
bughelp wanted

Métriques du dépôt

Stars
 (2 762 stars)
Métriques de merge PR
 (Métriques PR en attente)

Description

What?

Let's say you have a model like this:

class Article(models.Model):
    author = models.ForeignKey('Author')
    published = models.BooleanField()

    published_only = QueryManager(published=True)

Note that published_only is the default manager here.

Now if you do

an_author.article_set...

the published=True constraint is NOT added to the query.

Why?

When you access a related model that way, Django internally subclasses the model's default manager (db/models/fields/related.py, ForeignRelatedObjectsDescriptor:related_manager_cls) and uses that manager for the query. The issue here is that by the current implementation, django-model-utils' QueryManager keeps the constraints as instance state and not as class state. Which obviously means that the constraints are lost in the Django-generated related manager.

Solution 1

Fix this in Django: The Django-generated manager class should not only extend the default manager's class but the concrete instance. By not using inheritance for example.

Solution 2

Make QueryManager(...) call actually generate a subclass that incorporates the constraints (arguments). Probably easier but doesn't feel "right".

Guide contributeur