es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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__"
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema está en el filtro sub_service__type=0. El campo sub_service es una clave extranjera y el campo type es un SmallIntegerField.

    El filtro sub_service__type busca un SmallIntegerField en el modelo Services, pero no está presente.

    Para solucionar este problema, es necesario utilizar el filtro sub_service__type en el SubServiceSerializer en lugar del ServiceSerializer.

    Aquí está el código actualizado:

    # MODELOS
    
    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_)
    
    
    # VISTAS
    
    @action(detail=False, methods=['get'], permission_classes=(AllowAny,))
    def service_list(self, request):
    
        query = Services.objects.filter(parent_id__isnull=True)
        serializer = ServiceSerializer(query , many=True).data
        return Response(serializer)
    
    
    # SERIALIZADOR
    
    class SubServiceSerializer(serializers.ModelSerializer):
        type = serializers.SmallIntegerField(source='sub_service.type')
    
        class Meta:
            model = Services
            fields = "__all__"
    
    
    class ServiceSerializer(serializers.ModelSerializer):
        sub_service = SubServiceSerializer(many=True, queryset=Services.objects.filter(sub_service__type=0))
    
        class Meta:
            model = Services
            fields = "__all__"
    

Comments are closed.