Автоинкремент в дочерней модели

models.py

class Pallet_Mission(models.Model):
code = models.AutoField(primary_key=True)
load_type = models.CharField(max_length=20,null=True,blank=True)
mission_no = models.CharField(max_length=255, null=True,blank=True)

class PalletSubMission(models.Model):
mission_id = models.CharField(max_length=255,null=True,blank=True)
pallet_mission = models.ForeignKey(Pallet_Mission,on_delete=models.CASCADE,related_name='sub',null = True)
point = models.CharField(max_length=255,null=True,blank=True)

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

        "code": 52,
        "mission_no": "test1234",
        "load_type": "1234",
        "sub": [
            {
                "id": 75,
                "mission_id": "s1",
                "point": null,
   
                "pallet_mission": 52
            },
            {
                "id": 76,
                "mission_id": "s2",
                "point": null,
                "pallet_mission": 52
      
            }
        ],

    }

Сейчас мои "mission_id" вставляются вручную. Я хочу, чтобы "mission_id" моей дочерней модели был с автоинкрементом, например, показывал 's1' для первых данных 's2' для вторых данных и так далее. Но он будет сбрасываться в другом наборе данных, например, для данных "code":53 первые данные в "sub" будут начинаться снова с 's1'. Не уверен, что это автоматический инкремент, как я могу это сделать?

serializers.py

class PalletSubSerializers(serializers.ModelSerializer):
id = serializers.IntegerField(required=False)
class Meta:
    model = PalletSubMission
    fields = '__all__'

class Pallet_Mission_Serializer(serializers.ModelSerializer):
sub = PalletSubSerializers(many=True)
class Meta:
    model = Pallet_Mission
    fields = '__all__'

def create(self, validated_data):
    sub = validated_data.pop('sub')
    mission = Pallet_Mission.objects.create(**validated_data)
    for i in sub:
        PalletSubMission.objects.create(pallet_mission=mission,**i)
    
    return mission

def update(self,instance,validated_data):
    sub =validated_data.pop('sub')
    instance.load_type=validated_data.get('load_type',instance.load_type)
    instance.mission_no=validated_data.get('mission_no',instance.mission_no)
    
    instance.save()
    sub_mission = PalletSubMission.objects.filter(pallet_mission=instance.pk).values_list('id', flat=True)
    sub_mission_list =[]
    for i in sub:
        if "id" in i.keys():
            if PalletSubMission.objects.filter(id=i['id']).exists():
                sub_instance = PalletSubMission.objects.get(id=i['id'])
                sub_instance.mission_id = i.get('mission_id',sub_instance.mission_id)
                sub_instance.point = i.get('point',sub_instance.point)
             
                sub_instance.save()
                sub_mission_list.append(sub_instance.id)
            else:
                continue
        else:
            sub_instance = PalletSubMission.objects.create(pallet_mission=instance,**i)
            sub_mission_list.append(sub_instance.id)

    for i in sub_mission:
        if i not in sub_mission_list:
            PalletSubMission.objects.filter(pk=i).delete()
    return instance

Вы можете достичь этого, используя переопределение метода save() следующим образом

models.py

    class Pallet_Mission(models.Model):
          code = models.AutoField(primary_key=True)
          load_type = models.CharField(max_length=20,null=True,blank=True)
          mission_no = models.CharField(max_length=255, null=True,blank=True)
    
          def __str__(self):
                return self.load_type
    
    class PalletSubMission(models.Model):
          mission_id = models.CharField(max_length=255,null=True,blank=True,unique=True)
          pallet_mission = models.ForeignKey(Pallet_Mission,on_delete=models.CASCADE,related_name='sub',null = True)
          point = models.CharField(max_length=255,null=True,blank=True)
    
    
          def save(self, *args, **kwargs):
                count_obj = PalletSubMission.objects.all().count()+1
                self.mission_id = f's{count_obj}'
                super(PalletSubMission, self).save(*args, **kwargs)

Выходная панель администратора

enter image description here

Вернуться на верх