我想为网站的最终用户实现一个过滤器,以便他们可以按价格、评分、性别和位置进行过滤。
这里的问题是价格和评级存储在模型类“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/