自定义对象中的Django组链接:序列化问题

时间:2018-09-10 13:38:44

标签: django serialization grouping serializer

我尝试实现一个模型,其中将两个组链接在一起。我做了这个模型:

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 (“分组”格式的“分组”),但事实上,我在考虑了它之后在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

但是,我认为,因为我只在请求中指定了我的 Group 名称”,所以我在 GroupLinkerSerializer 中定义验证方法,以便手动验证所定义的组是否存在,如果存在,请授权 GroupLinker 创建并保存在数据库中。

我知道这可能有些棘手,但是我的过程的目标是能够在ORM表中的两个组之间创建链接(使用 GroupLinker 类)

请我真的需要帮助,我被困了一段时间。

亲切的问候。

本杰明。

0 个答案:

没有答案