71

私はこれらのモデルを持っています:

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

ここで、アクティブなFooをそのように持っているバーにクエリを実行したいと思います。

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

次のようなエラーが発生します

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

どうすればこれを達成できますか?

4

5 に答える 5

39

モデルのメソッドまたはプロパティに対してクエリを実行することはできません。クエリでその中の基準を使用するか、リスト内包表記またはジェネックスを使用してPythonでフィルタリングします。

于 2010-02-16T22:22:03.300 に答える
32

カスタムマネージャーを使用することもできます。次に、次のようなものを実行できます。

Bar.objects.foo_active()

そして、あなたがしなければならないのは:

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

ドキュメントをチェックしてください。

于 2014-01-26T12:00:32.277 に答える
24

同様の問題がありました。クラスベースのビューを使用しobject_listていて、モデルのメソッドでフィルタリングする必要がありました。(プロパティは時間に基づいており、cronジョブを作成する必要があるため、データベースに情報を保存することはできませんでし

私の答えは効果がなく、より大きなデータでどのようにスケーリングされるかわかりません。しかし、それは機能します:

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)
于 2013-03-05T13:15:20.750 に答える
10

メソッドをフィルタリングすることはできませんが、Fooのis_activeメソッドがFooの属性をチェックする場合は、次のような二重アンダースコア構文を使用できます。Bar.objects.filter(foo__is_active_attribute=True)

于 2010-02-16T22:24:29.893 に答える
-1
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)

このタイプの条件では、単純なフィルターを使用できる可能性があります。

Page.objects.filter(category__open=True)
于 2016-04-23T09:00:02.480 に答える