Django ، تصفية الاستعلام من طريقة النموذج
-
21-09-2019 - |
سؤال
لدي هذه النماذج:
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)