# views.py
class ProductViewSet(ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
filter_backends = (filters.DjangoFilterBackend, filters.OrderingFilter,)
filter_class = ProductFilter
def get_queryset(self):
queryset = super().get_queryset()
if self.request.method == 'GET':
brand_id = self.request.query_params.get('brand_id', None)
if brand_id:
queryset = queryset.prefetch_related(Prefetch('resources', queryset=Resource.objects.filter(brand_id=brand_id)))
else:
queryset = queryset.prefetch_related('resources')
return queryset
# filters.py
class ProductFilter(django_filters.FilterSet):
brand_id = django_filters.NumberFilter('resources__brand_id')
min_score = django_filters.NumberFilter('resources__score', lookup_type='gte', distinct=True)
class Meta:
model = Product
# models.py
class Resource(models.Model):
brand = models.ForeignKey(Brand, related_name='resources')
score = models.FloatField(null=True)
# Generic relation to Product and like.
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.IntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
class Product(models.Model):
resources = GenericRelation(Resource, related_query_name='product')