Обратный внешний ключ с таблицей перекрестных ссылок - Django Rest Framework - PullRequest
0 голосов
/ 26 декабря 2018

Я пытаюсь создать конечную точку API, которая будет предоставлять сводные данные о пользователе и группах, в которых он находится.

В моих текущих моделях User и UserGroup связаны с моделью членства.

Моя текущая проблема в том, что я не могу заставить работать список членов группы.

Я на правильном пути?Или есть лучший способ обработки сериализации / запросов моделей со многими отношениями?

Модели:

class UserGroup(models.Model):
    group_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=30)
    description = models.CharField(max_length=200)
    deleted = models.BooleanField(default=False)


class Membership(models.Model):
    group = models.ForeignKey(UserGroup, on_delete=models.CASCADE, related_name="members")
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="user_groups")
    isAdmin = models.BooleanField(default=False)

Сериализаторы:

class MemberSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ('first_name', 'last_name')

class MembershipSerializer(serializers.HyperlinkedModelSerializer):
    name = serializers.ReadOnlyField(source='group.name')
    description = serializers.ReadOnlyField(source='group.description')
    members = MemberSerializer(source='group.members', read_only=True, many=True)

    class Meta:
        model = Membership
        fields = ('name', 'description', 'members')


class UserSerializer(serializers.ModelSerializer):
    groups = MembershipSerializer(source='user_groups', read_only=True, many=True) 

    class Meta:
        model = User
        fields = ('username', 'groups')

Токовый выход:

{
    "username": "User 1",
    "groups": [
        {
            "name": "Group 1",
            "description": "Test Group",
            "members": [
                {}
            ]
        },
        {
            "name": "Group 2",
            "description": "Test Group 2",
            "members": [
                {}
            ]
        }
    ]
}

Ожидается: «members» содержит список пользователей, входящих в группу пользователей.

1 Ответ

0 голосов
/ 27 декабря 2018

Мне кажется, ваш код слишком сложный.

Модели:

from django.contrib.auth import models as dj_models

class Group(models.Model):
    group_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=30)
    description = models.CharField(max_length=200)
    deleted = models.BooleanField(default=False)
    members = models.ManyToManyField(dj_models.User, through='Membership', related_name='user_groups')


class Membership(models.Model):
    group = models.ForeignKey(Group, on_delete=models.CASCADE)
    user = models.ForeignKey(dj_models.User, on_delete=models.CASCADE)
    isAdmin = models.BooleanField(default=False)

Сериализаторы:

from django.contrib.auth import models as dj_models

class MemberSerializer(serializers.ModelSerializer):

    class Meta:
        model = dj_models.User
        fields = ('username',)


class GroupSerializer(serializers.ModelSerializer):
    members = MemberSerializer(many=True, read_only=True)

    class Meta:
        model = models.Group
        fields = ('name', 'description', 'members')


class UserSerializer(serializers.ModelSerializer):
    groups = GroupSerializer(many=True, read_only=True, source='user_groups')

    class Meta:
        model = dj_models.User
        fields = ('username', 'groups')

Вывод:

[
{
  "username":"Account 01",
  "groups":[
     {
        "name":"Group 01",
        "description":"Test Group",
        "members":[
           {
              "username":"Account 01"
           }
        ]
     },
     {
        "name":"Group 02",
        "description":"Test Group 2",
        "members":[
           {
              "username":"Account 01"
           }
        ]
     }
  ]
}
]
...