Добавить группу к пользователю в Django - PullRequest
0 голосов
/ 19 декабря 2018

Я создал 3 группы: 1. Персонал, 2. Администратор, 3. Операционный менеджер и назначенное разрешение.Теперь, когда бы я ни захотел добавить нового пользователя, я хотел показать поле выбора группы и иметь возможность выбрать группу.

В соответствии с платформой пользователь и группы имеют отношения многие ко многим, и я пытаюсьреализовать вложенный сериализатор.И в соответствии с документацией для добавления вложенных данных мне нужно реализовать метод create или update в сериализаторе, но здесь я не получаю поле выбора в группе, и данные равны нулю.

GroupSerializer:

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

UserSerializer:

class UserSerializers(serializers.ModelSerializer):
groups = GroupSerializer(many=True)

class Meta:
    model = User
    fields = ('first_name', 'last_name','address','contact', 'email', 'date_of_birth', 'branch', 'groups')

def create(self, validated_data):
    groups_data = validated_data.pop('groups')
    user = User.objects.create(**validated_data)
    for group_data in groups_data:
        Group.objects.create(user=user, **group_data)
    return user

, когда я хотел сделать запрос на публикацию, я получаю:

{
"first_name": "",
"last_name": "",
"address": "",
"contact": null,
"email": "",
"date_of_birth": null,
"branch": null,
"groups": []
}

здесьполя групп пусты.Если я пытаюсь сделать запрос на сообщение, он говорит:

{
"groups": [
    "This field is required."
]
}

Редактировать: Решено

Я удалил GroupSerializer, потому что User модель имеет отношение "многие ко многим" с Group, поэтомунам не нужно явно указывать Group объект

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


 class UserSerializers(serializers.ModelSerializer):
# groups = GroupSerializer(many=True)

class Meta:
    model = User
    fields = ('username','first_name', 'last_name','address','contact', 'email', 'date_of_birth', 'branch', 'groups')

def create(self, validated_data):
    groups_data = validated_data.pop('groups')
    user = User.objects.create(**validated_data)
    for group_data in groups_data:
        # Group.objects.create(user=user, **group_data)
        user.groups.add(group_data)
    return user

1 Ответ

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

Вы можете использовать PrimarykeyRelatedField и указать идентификатор группы, которую хотите добавить в список.как показано ниже:

class UserSerializers(serializers.ModelSerializer):
    groups = serializers.PrimaryKeyRelatedField(queryset=Group.objects.all())

    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'address', 'contact', 'email', 'date_of_birth', 'branch', 'groups')

    def create(self, validated_data):
        groups_data = validated_data.pop('groups')
        user = User.objects.create(**validated_data)
        for group_data in groups_data:
            Group.objects.create(user=user, **group_data)
        return user

    def to_representation(self, instance):
        r = super(UserSerializers, self).to_representation(instance)
        r.update({
        'groups': GroupSerializer(many=True).to_representation(instance.groups)
        })
        return r

Так что просто предоставьте список групп следующим образом: "groups": [1,2,3]

, и вам также следует переопределить метод to_representation, если вы хотите, чтобы результат json был сериализован для каждой группы.в ответ.

...