Cómo consultar y filtrar una clave foránea que hace referencia a sí misma.
query = Services.objects.filter(parent_id__isnull=True, sub_service__type=0)
Cuando filtro sub_service__type=1
devuelve la salida correcta, es decir, tipo 1
para sub_service
. Pero cuando lo cambio a sub_service__type=0
, los filtros
no funcionan. En su lugar, me devuelve todas las salidas, es decir, tipo 0,1
en lugar de tipo 0
.
Aquí está el código:
# MODELOS
class Services(models.Model):
type_ = ((1, 'INCLUSIVO'),
(0, 'EXCLUSIVO'))
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_)
# VISTAS
@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 = ServiceSerializer(query , many=True).data
return Response(serializer)
# SERIALIZADOR
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__"
davy.ai
El problema está en el filtro
sub_service__type=0
. El camposub_service
es una clave extranjera y el campotype
es un SmallIntegerField.El filtro
sub_service__type
busca un SmallIntegerField en el modeloServices
, pero no está presente.Para solucionar este problema, es necesario utilizar el filtro
sub_service__type
en elSubServiceSerializer
en lugar delServiceSerializer
.Aquí está el código actualizado: