2017-08-26 112 views
0

models.py如何扭轉查詢django_filters領域

class Product(models.Model): 
    . 
    . 
    pass 


class Color(models.Model): 
    color_name = models.CharField(blank=True, max_length=50) 
    color = ColorField(default='#FF0000') 


class ProductColor(models.Model): 
    product = models.ForeignKey('Product', on_delete=models.CASCADE) 
    color = models.ForeignKey('Color', on_delete=models.CASCADE) 

filters.py

class ProductFilter(django_filters.FilterSet): 
    class Meta: 
      model = Product 
      fields = ['color',] 

我想通過使用django_filters我應該怎麼做顏色過濾產品?

回答

0

您可以添加新的過濾器,以你的filters.py文件,而是指ProductColor模型。

filters.py

class ProductFilter(django_filters.FilterSet): 
    productcolor__color__color = django_filters.CharFilter(lookup_expr='iexact') 
    productcolor__color__color_name = django_filters.CharFilter(lookup_expr='iexact') 

    class Meta: 
     model = Product 

請注意,我使用productcolor__color__color來指代color財產在Color模型。雙下劃線訪問ForeignKey屬性。

lookup_expr='iexact'將匹配小寫和大寫色碼(#FFF *#FFF)。

然後一個簡單的HTML過濾您的查詢集可以是:

<form method="get"> 
    {{ filter.form.as_p }} 
    <button type="submit">Search</button> 
</form> 
<ul> 
    {% for product in filter.qs %} 
     <li>{{ product.name }}</li> 
    {% endfor %} 
</ul> 

{{ product.name }}只是一個例子,我不知道,如果你的Product模型有name場。但是您可以在{{ product.<field_name> }}之後訪問您的產品。

你可以閱讀更多關於django_filters這裏:https://simpleisbetterthancomplex.com/tutorial/2016/11/28/how-to-filter-querysets-dynamically.html

+0

thanks.but產品可以有多種顏色。這種方式顯示重複的產品。 – mmrz

+0

而不是爲'ProductColor'創建一個過濾器,嘗試爲'Product'創建它。然後在這個領域,你可以試試這個:'productcolor__color__color = django_filters.CharFilter(lookup_expr ='iexact')' –

+0

我編輯了答案以符合我以前的評論 –

0

裏面你的看法,你可以做一個這樣的查詢

c = Color('my desired color', '#ffffff') 
result = ProductColor.objects.filter(color=c.color) 
for r in result: 
    # do something ...