python - 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,
)
解决方案
这是文档中的一个示例:
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 = [] 中执行此显式内容
推荐阅读
- flutter - Flutter IOS just_audio在手机处于静音模式时不播放
- java - 如何修复 SQLState:从 Spring Boot 应用程序调用 postgres db 过程时出现 42809
- javascript - Fullcalendar 样式不同的事件
- authentication - 如何模拟 JMeter 中登录访问的真实加速期?
- java - 自定义对象映射器 bean 更改打开 Feign 客户端的默认属性/自动配置的 objectMapper bean
- docker - 在 docker 容器中运行应用程序时找不到 clojure.main
- tar - 如何在不提取的情况下检查未压缩 tar 文件的文件大小
- git - Git 对多个分支上的单行进行更改并保留所有更改
- asp.net-core - Asp.Net Core Identity + EF Core + CockroachDb = 非常慢
- java - Log4j2 - 日期不适用于新格式