Ссылка Django Group в Custom Object: проблема сериализации - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь реализовать модель, в которой связаны 2 группы.Я сделал эту модель:

GroupLinker.py

from django.contrib.auth.models import Group
from django.db import models

class GroupLinker(models.Model):
    EMSGroup = models.ForeignKey(Group, on_delete=models.CASCADE, related_name="EMSGroup", default=None)
    LDAPGroup = models.ForeignKey(Group, on_delete=models.CASCADE, related_name="LDAPGroup", default=None)

Но в моем запросе / POST я просто хочу указать их имена:

{
    "links": [
        {
            "EMSGroup": "UserAdministrator",
            "LDAPGroup": "master group"
        }
    ]
}

Моя главная проблема - выяснить, как реализовать это с помощью процесса сериализации Django.Я попытался реализовать GroupLinkerSerializer следующим образом:

GroupLinkerSerializer.py

from api.Models.GroupLinker import GroupLinker
from django.contrib.auth.models import Group
from rest_framework import serializers


class GroupSerializer(serializers.ModelSerializer):
    class Meta:
        model = Group
        fields = ('name',)


class GroupLinkerSerializer(serializers.ModelSerializer):
    EMSGroup = GroupSerializer()
    LDAPGroup = GroupSerializer()

    class Meta:
        model = GroupLinker
        fields = ("EMSGroup", "LDAPGroup")

Конечно, я понимаю, что он не может получить запрошенные группы самостоятельно (только с именами), поэтому я подумал, что в моем ClassView я мог бы сделать это и передать GroupLinkerSerializer необходимые параметры (группы в формате Dicted), но факт, что я установил имя каждой группы в GroupSerializerне имеет смысла после размышлений об этом ...

Вот мой взгляд (который не очень хорошо закодирован, я уже знаю):

GroupHandler.py

class EMSGroupHandler(APIView):
    authentication_classes = (SessionAuthentication, BasicAuthentication,)
    permission_classes = (IsAuthenticated, )
    def post(self, aRequest):
        # Post method implemented to make links between EMSGroups and LDAPGroups
        wDataLink = aRequest.data

        for link in wDataLink["links"]:

            # Group to link retrieval
            wEmsGroup = GroupLinkerSerializer().RetrieveGroup(aGroupName=link["EMSGroup"])
            wLDAPGroup = GroupLinkerSerializer().RetrieveGroup(aGroupName=link["LDAPGroup"])

            # Should I format Group to dict here???
            params = {
                "EMSGroup": <DICT GROUP 1>,
                "LDAPGroup": <DICT GROUP 2>
            }

            wGroupLinkerSerializer = GroupLinkerSerializer(data=params)
            # wGroupLinkerSerializer = GroupLinkerSerializer(wEmsGroup, wLDAPGroup)

            if wGroupLinkerSerializer.is_valid():
                print(wGroupLinkerSerializer.validated_data)
                wGroupLinkerSerializer.save()

        wResponse = Response(data=wDataLink, status=status.HTTP_200_OK)

        return wResponse

Однако я подумал, потому что я указал только мою Группу" имя " в запросе, который я имел, В GroupLinkerSerializer , чтобы определить методы проверки для ручной проверки того, что определенные группы существуют или нет, если существует, разрешите создание и сохранение GroupLinker в базе данных.

Я знаю, что это может быть немногохитро, но цельмоего процесса, чтобы иметь возможность создать связь между двумя группами в таблицах ORM (с классом GroupLinker )

Пожалуйста, мне действительно нужна помощь, я застрял на некоторое время.

С уважением.

Бенджамин.

...