![](/img/trans.png)
[英]How to write manager class to set default attribute value for models while retrieval/filtering in Django queries?
[英]How to set default value in Django while filtering objects from models
我正在嘗試創建一個函數,我希望用戶輸入一些細節,並在此基礎上我需要過濾掉這些數據並返回它。
例如,如果在我的模型名稱中,我有:
名稱。 年齡,性別然后我想做:
Profile.objects.filter(name=name, age=age, gender=gender)
姓名,年齡和性別是由用戶提供的值。 現在,如果用戶輸入name ='Shashank'並將年齡和性別留空,那么我需要查詢它:
Profile.objects.filter(name='Shashank')
而忽略所有那些空白值。 所以我不確定如何實現這種行為。 我可以設置什么類型的初始值,以便它不會影響搜索結果。
Profile.objects.filter(name='Shashank', age=<VALUE>, gender=<VALUE>)
過濾函數可以忽略<VALUE>
。
注意:我不想編寫所有可能的filter語句組合,因為它不方便。
我嘗試使用None
, False
但它給出了錯誤的結果
您可以為此創建一個管理器方法。
class ProfileManager(models.Manager):
def myfilter(self, **filters):
filters = {k:v for k,v in filters.items() if v is not None}
qs = self.get_queryset()
return qs.filter(**filters)
務必在模型中設置管理器
class Profile(models.Model):
objects = ProfileManager()
# the rest of the model
然后,您可以將name
age
和gender
(或任何其他列)傳遞給objects.myfilter
,它將忽略任何None
值。
# assume the following values are retrieved
# name = 'Shashank'
# age = None
# gender = None
qs = Profile.objects.myfilter(name=name, age=age, gender=gender)
這里的qs應該與objects.filter(name=name)
可能不是最好的解決方案,但我已經這樣做了:在檢查值是否為None時鏈接過濾器。
qs = Profile.objects.all()
if name:
qs = qs.filter(name=name)
if age:
qs = qs.filter(age=age)
if gender:
qs = qs.filter(gender=gender)
或許這個答案可以幫到你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.