python - Django-filter 1.1.0 中的多个模型

标签 python django django-models django-filter

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

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

在“comment”类中,“adventure”由外键引用。

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

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

filters.py

import django_filters

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

models.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,
    )

最佳答案

这是 the docs 中的示例:

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: The name of the model field to filter on. You can traverse “relationship paths” using Django’s __ syntax to filter fields on a related model. ex, manufacturer__name.

  • lookup_expr: The field lookup to use when filtering. Django’s __ syntax can again be used in order to support lookup transforms. ex, year__gte.

注意“__”链接,我认为您可以直接使用它,而无需在 fields = [] 内执行这些显式操作

关于python - Django-filter 1.1.0 中的多个模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53592160/

相关文章:

python - Django 导入错误 : No module named apps

python - 如何通过使用带有多个定界符的 df.str.split() 来保留定界符

Django 查询 : get the last entries of all distinct values by list

Django模型选择字段: Huge List of choices

python - 即使 keras 中的精度为 1.00,categorical_crossentropy 也会返回较小的损失值

python - 组内连续行与创建说明相同的字符串之间的数据帧差异

python - 当 models.py 中有 3 个自定义模型时,Django makemigrations 错误

Django 管理员通过 get_list_filter 在远程字段上进行过滤

python - 更新指向 settings.AUTH_USER_MODEL 的关系

python - 迭代数据库对象并将它们渲染到模板