首页 > 解决方案 > Django-filter 1.1.0 中的多个模型

问题描述

我想为网站的最终用户实施一个过滤器,以便他们可以按价格、评级、性别和位置进行过滤。

这里的问题是价格和评级存储在模型类“评论”中,而位置和性别存储在模型类“冒险”中。

在“评论”类中,“冒险”由外键引用。

如何在我的 filters.py 中使用 Django-filter 1.1.0 来处理相互引用的模型“comment”和“adventure”,以根据上述参数进行过滤?

这是我的代码,但只过滤了“冒险”类。如何扩展此代码以通过外部引用的参数进行过滤以返回匹配的冒险?

过滤器.py

import django_filters

class AdventureFilter(django_filters.FilterSet):
      class Meta:
            model = Adventure
            fields = {
            'gender',
            'location',
            }

模型.py

class Comment(models.Model):
    verfasser = models.ForeignKey(User, on_delete=models.CASCADE)
    related_adventure = models.ForeignKey(Adventure, on_delete=models.CASCADE, related_name='comments')
    rating_choices = (
                      (1, '1 Stern'),
                      (2, '2 Sterne'),
                      (3, '3 Sterne'),
                      (4, '4 Sterne'),
                      (5, '5 Sterne')
    )       
    Rating = models.PositiveIntegerField(null=True, choices=rating_choices,blank=False, default=0)
    verfasst_am = models.DateTimeField(default=timezone.now, blank=True, null=True)
    heading = models.CharField(max_length=100,blank=True,null=True, help_text="100 Zeichen")
    ratingtext= models.TextField(max_length=400, blank=True, null=True,help_text="400 Zeichen")

    price = models.PositiveIntegerField(null=True, help_text="Deine Ausgaben (pro Kopf) bei diesem Adventure", blank=True)



class Adventure(models.Model):
    adventure_id = models.AutoField(primary_key=True)
    owner = models.ForeignKey(User,on_delete=models.CASCADE, null=True)
    name = models.CharField(max_length=64)
    place = PlacesField(blank=False)
    location_CHOICES = (
            ('IN', 'indoor'),
            ('OUT', 'outdoor'),
            ('INOUT', 'indoor and outdoor'),
    )
    location = models.CharField(
            max_length=10,
            choices=lokation_CHOICES,
    )


    gender_CHOICES = (
            ('male', 'male'),
            ('female', 'female'),
            (EGAL, 'egal'),
    )
    gender= models.CharField(
            max_length=9,
            choices=geschlecht_CHOICES,
            default=EGAL,
    )

标签: pythondjangodjango-modelsdjango-filter

解决方案


这是文档中的一个示例:

class ProductFilter(django_filters.FilterSet):
    price = django_filters.NumberFilter()
    price__gt = django_filters.NumberFilter(name='price', lookup_expr='gt')
    price__lt = django_filters.NumberFilter(name='price', lookup_expr='lt')

    release_year = django_filters.NumberFilter(name='release_date', lookup_expr='year')
    release_year__gt = django_filters.NumberFilter(name='release_date', lookup_expr='year__gt')
    release_year__lt = django_filters.NumberFilter(name='release_date', lookup_expr='year__lt')

    manufacturer__name = django_filters.CharFilter(lookup_expr='icontains')

    class Meta:
        model = Product

过滤器有两个主要参数:

  • name:要过滤的模型字段的名称。您可以使用 Django 的 __ 语法遍历“关系路径”来过滤相关模型上的字段。例如,制造商名称。

  • lookup_expr:过滤时使用的字段查找。可以再次使用 Django 的 __ 语法来支持查找转换。例如,年份__gte。

请注意“__”链接,我认为您可以直接使用它,而无需在 fields = [] 中执行此显式内容


推荐阅读