簡體   English   中英

如何對 Django 中的外鍵字段使用 django-filter package?

[英]How to use django-filter package for foreign key fields in Django?

大家好!

Django 中的新功能,很困惑,感謝幫助,我創建了一個表,感謝 stackoverflow 用戶:喜歡:

組織 上訴總數 書面形式上訴的數量 口頭形式上訴的數量
組織 1 3 1 2
組織 2 2 1 1

擁有三種型號:

class Organization(models.Model):
    organization_name = models.CharField(max_length=50)


class AppealForm(models.Model):
    form_name = models.CharField(max_length=50)


class Appeal(models.Model):
    organization = models.ForeignKey(Organization, on_delete=models.CASCADE)
    appeal_form = models.ForeignKey(AppealForm, on_delete=models.CASCADE)
    applicant_name = models.CharField(max_length=150)
    appeal_date = models.DateField()

組織對象 model:

機構名稱
組織 1
組織 2

AppealForm model 的對象:

表格名稱
書面
口頭形式

上訴對象 model:

組織 上訴表格 申請人姓名
組織 1 書面 名字和姓氏
組織 1 口頭形式 名字和姓氏
組織 1 口頭形式 名字和姓氏
組織 2 書面 名字和姓氏
組織 2 口頭形式 名字和姓氏

views.py文件的function中,我創建了一個查詢來渲染,比如:

from django.db.models import Count, Q

organizations = Organization.objects.annotate(
).annotate(
    total=Count('appeal'),
    total_written=Count('appeal', filter=Q(appeal__appeal_form__form_name='in written form')),
    total_oral=Count('appeal', filter=Q('appeal__appeal_form__form_name='in oral form'))
)

現在我想通過AppealForm model 和上訴日期( Appeal model上訴日期字段)過濾表格內容。 案例:用戶打開一個表格,然后從表格上方的搜索欄中選擇要查看的上訴表格和/或日期范圍。

問題:如何使用 django-filter package 過濾 views.py 中的上述查詢?

定義復雜過濾器的最通用方法是使用方法參數。 我不能說我完全理解你的問題,但你可以應用任何你可以通過這種方式設計查詢集的過濾器。 概述:

將 django-filters 導入為 DF

class SomeFilters( DF.FilterSet):

    name = DF.xxxFilter( method='my_method', field_name='object_field', label='whatever',  ...)
    ...

    def my_method( self, qs, name, value):
        # in here you create a new more restrictive queryset based on qs
        # to implement your filter, and return it.
        # name is the field name. Note, you don't have to use or follow it
        # value is the value that the user typed

        qs = qs.filter( ...) # or .exclude, or complicated stuff  
        return qs

這是我編寫的一個相當簡單的方法,用於創建一個帶有去掉空格的字段值的注釋,然后對其進行文本包含過濾器。

    def filter_array_desc( self, qs, name, value):
        value = value.replace(' ','')
        qs = qs.annotate(
            arr_d_nospaces = Replace( 'array_desc', Value(' '), Value('')) # delete all spaces
        ).filter(
            arr_d_nospaces__icontains = value )
        return qs

這是一個通用的,可以通過ChoiceFilter應用於任何字段以過濾該字段是否為空白:

    YESNO = (('Y','Yes'), ('N','No'))
    marr_b = FD.ChoiceFilter( field_name='marr', label='M_array is blank',  method='filter_blank_yesno', 
                              choices=YESNO, empty_label="Don't Care" )
    ...

    def filter_blank_yesno( self, qs, name, value):
        if value=="Y":
            return qs.filter(**{ name:'' })
        elif value=="N":
            return qs.exclude( **{ name:'' })
        raise ValueError(f'filter_blank_yesno received value="{value}" which is neither "Y" nor "N"')

希望這可以幫助。 您基本上將通過遵循模型之間的關系進行過濾,使用雙下划線在模型之間移動,並可能對注釋進行注釋和過濾,或者使用 Q 對象等進行操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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