@HELLSP4RK

Как создать несколько связанных объектов из JSON?

Есть JSON вида:
[
  {
    "groupId": 123,
    "groupName": "Group 1",
    "monthName": "Май",
    "monthNumber": 5,
    "year": 2021,
    "usersDutyList": [
      {
        "userName": "Test",
        "userFullname": "Test User",
        "userId": 553,
        "userEmail": "asd@asd.com",
        "isOnDutyThisMonth": true,
        "userPhone": "+1 234 5678",
        "userExt": "123",
        "isOwner": "false"
      },
      {
        "userName": "Test2",
        "userFullname": "Test2 User",
        "userId": 458,
        "userEmail": "qwe@qwe.com",
        "isOnDutyThisMonth": true,
        "userPhone": "+1 234 5678",
        "userExt": "321",
        "isOwner": "false"
      },
    ]
  }
]


Я написал такие модели:
class Group(Model):
    groupId = SmallIntegerField(primary_key=True, verbose_name='ID группы')
    groupName = CharField(max_length=100, verbose_name='Наименование')
    monthName = CharField(max_length=8, choices=MONTH_NAME_CHOICES, verbose_name='Название месяца')
    monthNumber = SmallIntegerField(choices=MONTH_NUMBER_CHOICES, verbose_name='Номер месяца')
    year = SmallIntegerField(choices=YEAR_CHOICES, default=datetime.datetime.now().year)

class User(Model):
    userName = CharField(max_length=20, unique=True, verbose_name='Логин')
    userFullname = CharField(max_length=40, verbose_name='ФИО')
    userId = SmallIntegerField(primary_key=True, verbose_name='ID пользователя')
    userEmail = EmailField(unique=True, verbose_name='Email')
    userPhone = CharField(max_length=15, verbose_name='Номер телефона')
    userExt = CharField(max_length=10, verbose_name='Добавочный')
    isOwner = BooleanField(verbose_name='Руководитель группы')
    group = ForeignKey(Group, on_delete=CASCADE, related_name='usersDutyList', verbose_name='Группа')


Мне необходимо из этого JSON создать объект модели Group и пользователей, связанных с ней, из ключа usersDutyList.

Написал такие сериализаторы:
class UserSerializer(HyperlinkedModelSerializer):

    class Meta:
        model = User
        fields = '__all__'


class GroupSerializer(HyperlinkedModelSerializer):
    usersDutyList = UserSerializer(many=True, required=False)

    def create(self, validated_data):
        users = validated_data.pop('usersDutyList')
        group = Group.objects.create(**validated_data)
        for user in users:
            user_dict = dict(user)
            User.objects.create(group=group.groupId, **user_dict)
        return group


Но так как в сериализатор UserSerializer не передается объект группы, то я закономерно получаю ответ
[
    {
        "usersDutyList": [
            {
                "group": [
                    "Обязательное поле."
                ]
            }
        ]
    },
    {
        "usersDutyList": [
            {
                "group": [
                    "Обязательное поле."
                ]
            }
        ]
    }
]


Подскажите, пожалуйста, как реализовать такой функционал?
  • Вопрос задан
  • 129 просмотров
Пригласить эксперта
Ответы на вопрос 1
Mi11er
@Mi11er
A human...
Это обязательно делать через DRF ?
Почему просто не пройтись циклом и создавать объекты ?
Первый же объект, группы, дальше цикл перебора юзеров и их создание.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы