簡體   English   中英

如何在模型中過濾對象時在Django中設置默認值

[英]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語句組合,因為它不方便。

我嘗試使用NoneFalse但它給出了錯誤的結果

您可以為此創建一個管理器方法。

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 agegender (或任何其他列)傳遞給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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM