79 votes

Django, filtrage de requête à partir de la méthode du modèle

J'ai ces modèles :

def Foo(Models.model):
    size = models.IntegerField()
    # autres champs

    def is_active(self):
         if check_condition:
              return True
         else:
              return False

def Bar(Models.model):
     foo = models.ForeignKey("Foo")
     # autres champs

Maintenant je veux interroger les Bars qui ont des Foo actifs comme ceci :

Bar.objects.filter(foo.is_active())

Je reçois des erreurs telles que

SyntaxError at /
('non-keyword arg after keyword arg'

Comment puis-je réaliser cela ?

0voto

oldtechaa Points 1321

Une option consiste à utiliser django-denorm pour créer essentiellement dynamiquement un champ de modèle :

@denorm.denormalized(models.BooleanField, null=True, default=False)
@denorm.depend_on_related("Bar")
def is_active(self):
    # return something

Ensuite, vous pouvez filtrer par foo__is_active=True.

Après avoir ajouté ceci, utilisez manage.py makemigrations et manage.py migrate et manage.py denorm-init pour préparer la base de données. Ce n'est peut-être pas la meilleure solution car les modèles devraient principalement représenter la structure de la base de données, et ne pas faire beaucoup de travail eux-mêmes, mais c'est ce que mon prédécesseur a fait.

-1voto

Sergey Luchko Points 925
class Page(models.Model):
    category = models.ForeignKey(Category)
    title = models.CharField(max_length=128)
    url = models.URLField()
...

class Category(models.Model):
    ...
    open = models.BooleanField(default=True)

Peut-être pouvez-vous utiliser un filtre simple pour ce type de conditions.

Page.objects.filter(category__open=True)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X