سؤال

لدي هذه النماذج:

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

الآن أريد الاستعلام عن أشرطة لها فو النشط على هذا النحو:

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

أنا أتلقى خطأ مثل

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

كيف يمكنني تحقيق ذلك؟

هل كانت مفيدة؟

المحلول

لا يمكنك الاستعلام مقابل أساليب النموذج أو الخصائص. إما استخدام المعايير الموجودة داخلها في الاستعلام ، أو تصفية في Python باستخدام فهم قائمة أو Genex.

نصائح أخرى

يمكنك أيضا استخدام مدير مخصص. ثم يمكنك تشغيل شيء مثل هذا:

Bar.objects.foo_active()

وكل ما عليك فعله هو:

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

تفحص ال مستندات.

لقد واجهت مشكلة مماثلة: أنا أستخدم العرض القائم على الفصل object_list واضطررت إلى تصفية طريقة النموذج. (لم يكن تخزين المعلومات الموجودة في قاعدة البيانات خيارًا لأن الخاصية كانت تستند إلى الوقت ، وكان عليّ إنشاء cronjob و/أو ... مستحيل)

إجابتي غير فعالة ولا أعرف كيف ستعمل على حجمها على البيانات الأكبر ؛ ولكنه يعمل:

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)

لا يمكنك التصفية على الأساليب ، ولكن إذا فحصت طريقة IS_ACTION في FOO سمة على FOO ، يمكنك استخدام بناء جملة inderscore المزدوج مثل 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)

قد يمكنك استخدام مرشح بسيط ، لهذا النوع من الظروف.

Page.objects.filter(category__open=True)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top