Как выполнить запрос с фильтром по внешнему ключу
query = Services.objects.filter(parent_id__isnull=True,sub_service__type=0)
Когда я фильтрую sub_service__type=1
Он возвращает правильный вывод. т.е. type 1
для sub_service
, Но когда я меняю его на sub_service__type=0
filters
не работает. Вместо этого он возвращает мне любой вывод, т.е. type 0,1
вместо type 0
Вот код:
# MODELS
class Services(models.Model):
type_ = ((1, 'INCLUSIVE'),
(0, 'EXCLUSIVE'))
service_id = models.AutoField(primary_key=True)
parent_id = models.ForeignKey('self', on_delete=models.SET_NULL, null=True, blank=True, related_name='sub_service')
type = models.SmallIntegerField(blank=True, null=True, choices=type_)
# VIEWS
@action(detail=False, methods=['get'], permission_classes=(AllowAny,))
def service_list(self, request):
query = Services.objects.filter(parent_id__isnull=True,sub_service__type=0)
serializer = SubServiceSerializer(query , many=True).data
return Response(serializer.data)
# SERIALIZER
class SubServiceSerializer(serializers.ModelSerializer):
class Meta:
model = Services
fields = "__all__"
class ServiceSerializer(serializers.ModelSerializer):
sub_service = SubServiceSerializer(many=True)
class Meta:
model = Services
fields = "__all__"
Если вы фильтруете с помощью sub_service__type=1
, вы получаете все Service
, которые имеют по крайней мере один связанный Service
с type=1
. Но при этом допускается, что существуют другие связанные подService
ы с другим типом. Менеджер .sub_service
далее не будет фильтровать набор связанных объектов.
Вы можете использовать Prefetch
объект [Django-doc] для фильтрации отношения, а также:
from django.db.models import Prefetch
query = Services.objects.filter(
parent_id__isnull=True,sub_service__type=0
).prefetch_related(Prefetch('sub_service', Service.objects.filter(type=0)))