Фильтрация списка элементов на основе модели @property во ViewSet - Django Rest Framework - PullRequest
0 голосов
/ 03 октября 2018

Ниже приведена структура данных, которая может быть доступна через конечную точку, построенную с Django Rest Framework :

"sites": [{
    "id": 1,
    "configs": [
        {
            "id": 1,
            "subconfigs": [
                {
                    "id": 1,
                    "name": "subconfig_1",
                    "macro_subconfigs": [1, 2]
                    "flag": true
                },
                {
                    "id": 2,
                    "name": "subconfig_2",
                    "macro_subconfigs": [1]
                    "flag": false
                },
                {
                    "id": 3,
                    "name": "subconfig_3",
                    "macro_subconfigs": [2]
                    "flag": false
                },
            ],
            "macro_subconfigs": [
                {
                    "id": 1,
                    "flag": true,
                    "subconfigs": [
                        {
                            "id": 1,
                            "name": "subconfig_1",
                            "macro_subconfigs": [1, 2]
                            "flag": true
                        },
                        {
                            "id": 2,
                            "name": "subconfig_2",
                            "macro_subconfigs": [1]
                            "flag": false
                        },
                    ],
                    "name": "macro_subconfig_1"
                },
                {
                    "id": 2,
                    "flag": false,
                    "subconfigs": [
                        {
                            "id": 1,
                            "name": "subconfig_1",
                            "macro_subconfigs": [1, 2]
                            "flag": true
                        },
                        {
                            "id": 3,
                            "name": "subconfig_3",
                            "macro_subconfigs": [2]
                            "flag": false
                        },
                    ],
                    "name": "macro_subconfig_2"
                },
            ]
        }
    ]
}]

Моими моделями являются следующие:

Config

class Config(TimeStampedModel):
    site = models.ForeignKey("site.Site", related_name="configs")
    @property
    def macro_subconfigs(self):
        try:
            return MacroSubConfig.objects.filter(subconfigs__config__pk=self.pk).distinct()
        except MacroSubConfig.DoesNotExist:
            return tuple()

SubConfig

class SubConfig(TimeStampedModel):
    name = models.CharField(max_length=200)
    config = models.ForeignKey(
        "Config", related_name="subconfigs", on_delete=models.CASCADE
    )
    flag = models.BooleanField(default=True)

MacroSubConfig

class MacroSubConfig(TimeStampedModel):
    name = models.CharField(max_length=100)
    subconfigs = models.ManyToManyField(SubConfig, related_name="macro_subconfigs")
    flag = models.BooleanField(default=True)

И мои сериализаторы:

class SiteConfigSerializer(serializers.HyperlinkedModelSerializer):
    configs = ConfigSerializer(many=True)
    class Meta:
        model = Site
        fields = ("name", "configs")

class SubConfigSerializer(serializers.ModelSerializer):
    class Meta:
        model = SubConfig
        fields = ("name")

class ConfigSerializer(serializers.ModelSerializer):
    subconfigs = SubConfigSerializer(many=True)
    macro_subconfigs = MacroSubConfigSerializer(many=True)
    class Meta:
        model = Config
        fields = ("name", "subconfigs", "macro_subconfigs")

class MacroSubConfigSerializer(serializers.HyperlinkedModelSerializer):
    subconfigs = serializers.PrimaryKeyRelatedField(
        many=True, queryset=SubConfig.objects.all()
    )
    class Meta:
        model = MacroSubConfig
        fields = ["subconfigs", "name"]

В моем SiteViewSet я хотел бы отфильтровать macro_subconfigs в списке macro_subconfigs, который имеет flag: true.Мне уже удалось сделать то же самое для subconfigs в списке подконфигураций.

Ожидаемый результат следующий:

"sites": [{
    "id": 1,
    "configs": [
        {
            "id": 1,
            "subconfigs": [
                {
                    "id": 1,
                    "name": "subconfig_1",
                    "macro_subconfigs": [1, 2]
                    "flag": true
                }
            ],
            "macro_subconfigs": [
                {
                    "id": 1,
                    "flag": true,
                    "subconfigs": [
                        {
                            "id": 1,
                            "name": "subconfig_1",
                            "macro_subconfigs": [1, 2]
                            "flag": true
                        },
                        {
                            "id": 2,
                            "name": "subconfig_2",
                            "macro_subconfigs": [1]
                            "flag": false
                        },
                    ],
                    "name": "macro_subconfig_1"
                }
            ]
        }
    ]
}]

Как вы фильтруете элементы из списка в объекте ConfigВ SiteViewSet?

Не стесняйтесь спрашивать меня больше точности, если это необходимо.Спасибо


Больше информации

Что я пробовал в моем ViewSet

class SiteConfigViewSet(PublicViewSet):
    serializer_class = serializers.SiteConfigSerializer

    def get_queryset(self):
        subconfigs =  Process.objects.filter(flag=True)
        macro_subconfigs =  MacroProcess.objects.filter(flag=True)
        return permissions.get_allowed_sites(self.request).prefetch_related(
            Prefetch("configs__subconfigs", queryset=subconfigs),
            Prefetch("configs__subconfigs__macro_subconfigs", queryset=macro_subconfigs),
    )
...