Автоинкремент в дочерней модели
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)