фильтр django rest framework для связанных таблиц

Мне нужна помощь в фильтрации поля в связанной таблице.

У меня есть две модели Kalas и имена, где одна (модель Kalas) имеет отношение один к одному с базовой моделью пользователя:

class Kalas(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    visitKalas = models.ForeignKey('self', on_delete=models.DO_NOTHING, blank=True, null=True)
    isActive = models.BooleanField(default=True)
    capacity = models.IntegerField(default=0)
    fullName = models.CharField(max_length=100, default="default name")
    phoneNumber = models.IntegerField()
    address = models.CharField(max_length=40)
    postal = models.CharField(max_length=50)
    time = models.DateTimeField(auto_now_add=True)
    lat = models.FloatField(default=0)
    lng = models.FloatField(default=0)

    def __str__(self):
        return "user: %s, address: %s %s" % (self.user, self.address, self.postal)

class names(models.Model):
    kalasID = models.ForeignKey(Kalas, on_delete=models.CASCADE, related_name='names')
    name = models.CharField(max_length=30)

и я сделал вложенный сериализатор:

class NamesMapSerializer(serializers.ModelSerializer):
class Meta:
    model = names
    fields = ['name']


class KalasMapSerializer(serializers.ModelSerializer): #bruk denne hver gang man vil ha kalas og navn sammen
    names = NamesMapSerializer(many=True, read_only=True)
    class Meta:
        model = Kalas
        fields = ['id', 'fullName', 'capacity', 'lat', 'lng', 'names']


class MapSerializer(serializers.ModelSerializer):
    kalas = KalasMapSerializer()
    class Meta:
        model = User
        fields = ['username', 'kalas']

и представление, в котором перечислены все пользователи и их калас с именами:

class MapViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    permissions_classes = [permissions.AllowAny]
    serializer_class = MapSerializer

но я не знаю, как фильтровать, поэтому он показывает только пользователей с активными kalas.isActive=True.

Я пробовал это, но теперь он проверяет пользовательские модели is_active, а не поле isActive Каласа:

class ActiveOnMap(generics.ListAPIView):
    def get_queryset(self):
        return User.objects.all().filter(isActive=True)
    serializer_class = MapSerializer

плиз помогите я новичок :)


person oleM    schedule 28.02.2020    source источник


Ответы (1)


Обновите фильтр набора запросов, как показано ниже:

class ActiveOnMap(generics.ListAPIView):
    def get_queryset(self):
        return User.objects.filter(kalas__isActive=True)
    serializer_class = MapSerializer

Я надеюсь, что это поможет вам :)

person PyMaster    schedule 28.02.2020
comment
Спасибо большое все получилось!! :) Я проголосовал за ваш ответ, но, поскольку у меня не более 15 репутаций, он не будет отображаться. СПАСИБО! - person oleM; 29.02.2020