Tôi đã cố gắng để có được một ModelMultipleChoiceFilter để làm việc trong nhiều giờ và đã đọc cả tài liệu Bộ lọc DRF và Django.Làm thế nào để sử dụng ModelMultipleChoiceFilter?
Tôi muốn có thể lọc một tập hợp các trang web dựa trên các thẻ đã được gán cho chúng thông qua ManyToManyField. Ví dụ: tôi muốn có thể nhận danh sách các trang web đã được gắn thẻ "Nấu ăn" hoặc "Nuôi ong".
Dưới đây là đoạn mã có liên quan của models.py hiện tại của tôi:
class SiteTag(models.Model):
"""Site Categories"""
name = models.CharField(max_length=63)
def __str__(self):
return self.name
class Website(models.Model):
"""A website"""
domain = models.CharField(max_length=255, unique=True)
description = models.CharField(max_length=2047)
rating = models.IntegerField(default=1, choices=RATING_CHOICES)
tags = models.ManyToManyField(SiteTag)
added = models.DateTimeField(default=timezone.now())
updated = models.DateTimeField(default=timezone.now())
def __str__(self):
return self.domain
Và đoạn views.py hiện tại của tôi:
class WebsiteFilter(filters.FilterSet):
# With a simple CharFilter I can chain together a list of tags using &tag=foo&tag=bar - but only returns site for bar (sites for both foo and bar exist).
tag = django_filters.CharFilter(name='tags__name')
# THE PROBLEM:
tags = django_filters.ModelMultipleChoiceFilter(name='name', queryset=SiteTag.objects.all(), lookup_type="eq")
rating_min = django_filters.NumberFilter(name="rating", lookup_type="gte")
rating_max = django_filters.NumberFilter(name="rating", lookup_type="lte")
class Meta:
model = Website
fields = ('id', 'domain', 'rating', 'rating_min', 'rating_max', 'tag', 'tags')
class WebsiteViewSet(viewsets.ModelViewSet):
"""API endpoint for sites"""
queryset = Website.objects.all()
serializer_class = WebsiteSerializer
filter_class = WebsiteFilter
filter_backends = (filters.DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter,)
search_fields = ('domain',)
ordering_fields = ('id', 'domain', 'rating',)
Tôi vừa được thử nghiệm với các chuỗi truy vấn [/path/to/sites]?tags=News
và tôi Đảm bảo 100% rằng các bản ghi thích hợp tồn tại khi chúng hoạt động (như được mô tả) với truy vấn ?tag
(thiếu truy vấn s
).
Một ví dụ về những điều khác tôi đã cố gắng là một cái gì đó như:
tags = django_filters.ModelMultipleChoiceFilter(name='tags__name', queryset=Website.objects.all(), lookup_type="in")
Làm thế nào tôi có thể trả lại bất kỳ trang web mà có một SiteTag thỏa mãn name == A OR name == B OR name == C
?
Tôi đã giải quyết được vấn đề của mình ngay bây giờ bằng cách làm theo hướng dẫn của [Có thể thực hiện 'in'' lookup_type' thông qua bộ phân tích cú pháp URL bộ lọc django?] (Https://stackoverflow.com/questions/24041639/possible -to-do-an-trong-tra cứu-loại-qua-the-django-bộ lọc-url-phân tích cú pháp? rq = 1) và tạo Bộ lọc tùy chỉnh. Tôi vẫn quan tâm đến việc xem giải pháp cho vấn đề của mình vì tôi chắc chắn rằng nó sẽ giúp người khác - và mã mà tôi không sử dụng sẽ không có lỗi :) –