Question

Je ces modèles:

def Foo(Models.model):
    size = models.IntegerField()
    # other fields

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

def Bar(Models.model):
     foo = models.ForeignKey("Foo")
     # other fields

Maintenant, je veux interroger bars qui ont des Foo comme actif tel:

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

J'obtiens l'erreur comme

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

Comment puis-je y parvenir?

Était-ce utile?

La solution

Vous ne pouvez pas interroger sur les méthodes de modèle ou propriétés. Soit utiliser les critères en son sein dans la requête, ou filtrer en Python en utilisant une compréhension de liste ou Genex.

Autres conseils

Vous pouvez également utiliser un gestionnaire personnalisé. Ensuite, vous pouvez exécuter quelque chose comme ceci:

Bar.objects.foo_active()

Et tout ce que vous avez à faire est:

class BarManager(models.Manager):
    def foo_active(self):
       # use your method to filter results
       return you_custom_queryset

Consultez la docs .

J'eu le même problème: je suis grâce à la vue basée sur la classe object_list et je devais filtrer par la méthode de modèle. (Stocker les informations dans la base de données n'a pas été une option parce que la propriété était basée sur le temps et je dois créer un cronjob et / ou ... aucun moyen )

Ma réponse est inefficace et je ne sais pas comment ça va sur l'échelle des données plus; mais cela fonctionne:

q = Model.objects.filter(...)...
# here is the trick
q_ids = [o.id for o in q if o.method()]
q = q.filter(id__in=q_ids)

Vous ne pouvez pas filtrer sur les méthodes, si la méthode is_active Foo vérifie un attribut Foo, vous pouvez utiliser la syntaxe double underscore comme Bar.objects.filter(foo__is_active_attribute=True)

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 que vous pouvez utiliser le filtre simple, pour ce type de conditions.

Page.objects.filter(category__open=True)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top