@robocop45
Only python

Как сохранять данные из m2m поля?

Всем привет, задача: пользователь выбирает предложенные пункты(болезни) и они сохраняются в бд
64aab0a720a29086684221.jpeg

models

class User(AbstractBaseUser):
    is_required = models.BooleanField(verbose_name=_('Статус подтверждения'), default=False, blank=True)
    is_staff = models.BooleanField(verbose_name=_('Статус персонала'), default=False)
    group = models.ForeignKey('Groups', verbose_name=_('Группа'), on_delete=models.CASCADE, )
    center = models.ForeignKey('Centers', verbose_name=_('Центр'), on_delete=models.PROTECT, null=True, blank=True)
    disease = models.ManyToManyField('Disease', verbose_name=_('Заболевание'),  blank=True)
    number = models.CharField(verbose_name=_('Номер'), max_length=30, unique=True, null=True)
...
class Disease(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name if self.name else "Unnamed"


serializer
class UserSerializer(serializers.Serializer):
    number = serializers.CharField()
    password1 = serializers.CharField(write_only=True)
    password2 = serializers.CharField(write_only=True)
    center_id = serializers.IntegerField(allow_null=True, required=False)
    disease_id = serializers.ListSerializer(child=serializers.PrimaryKeyRelatedField(queryset=Disease.objects.all()),
                                            allow_null=True, required=False)
    stage = serializers.IntegerField(read_only=True)
    group = serializers.CharField()



    def create(self, validated_data):
        self.create_validate(validated_data)
        code = self.context['request'].data.get('code')
        print(code, 'code from serializer')
        stage = self.context['request'].data.get('stage')
        user = None

        if stage == '1':
            user = User.objects.create_user(
                number=validated_data['number'],
                password=validated_data['password1'],
                group=validated_data['group']
            )
            user.stage = stage
            validated_data['stage'] = stage

        if stage == '2':
            center_id = validated_data.get('center_id')
            disease_ids = validated_data.get('disease_id', [])

            try:
                user = User.objects.get(number=validated_data['number'])
                try:
                    center = Centers.objects.get(id=center_id)
                    user.center_id = center.id
                    user.country = center.country
                except Centers.DoesNotExist:
                    user.center_id = None
                user.disease.clear()
                #здесь начинается логика сохранения disease_id
                if disease_ids:
                    for disease_id in disease_ids:
                        disease = Disease.objects.get(pk=disease_id)
                        user.disease.add(disease)
                user.stage = stage
                validated_data['stage'] = stage
            except User.DoesNotExist:
                raise serializers.ValidationError('User does not exist for stage 2')
...
#stage - это шаг регистрации


ИЗМ:

немного проставил принтов и все они возвращают пустой список
if stage == '2':
            center_id = validated_data.get('center_id')
            disease_ids = validated_data.get('disease_id', [])
            print(disease_ids, 'test1')
            print(type(disease_ids))
            try:
                user = User.objects.get(number=validated_data['number'])
                try:
                    center = Centers.objects.get(id=center_id)
                    user.center_id = center.id
                    user.country = center.country
                except Centers.DoesNotExist:
                    user.center_id = None
                print(disease_ids, 'dis_id1')
                #здесь начинается логика сохранения disease_id

                for disease_id in disease_ids:
                    disease = Disease.objects.get(pk=disease_id)
                    disease_ids.append(disease)
                    print(disease_ids, 'dis_id2')
                user.stage = stage
                validated_data['stage'] = stage
            except User.DoesNotExist:
                raise serializers.ValidationError('User does not exist for stage 2')


буду благодарен за помощь)
  • Вопрос задан
  • 70 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы