Настройка отклика в Serializer с помощью Django Rest Framework - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть две модели, такие как,

class ModelA(models.Model):
    counter = models.SmallIntegerField(db_column='counter', blank=False, default=0)

class ModelB(models.Model):
    a = models.ForeignKey(ModelA, on_delete=models.CASCADE, null=False, related_name='relation_a')

Сериализатор ModelB. Я смотрю, есть ли уже строка ModelA в таблице ModelB. Если есть, я увеличиваю значение в ModelA; в противном случае я создаю его и помещаю значение счетчика 1 в ModelA. Ответом является значение счетчика, поступающее от ModelA. Проблема в том, что ответом является старое значение перед выполнением этой функции создания.

class ModelBSerializer(BaseSerializer):
    a = serializers.IntegerField(read_only=True, source='a.counter')

    def create(self, validated_data):
        try:
            bInstance = ModelB.objects.get(a__id=validated_data.get('modelA').id)
            aInstance = ModelA.objects.get(pk=validated_data.get('a').id)
            aInstance.counter = 1
            aInstance.save()
        except DealThumbsCounter.DoesNotExist:
            bInstance = ModelB.objects.create(**validated_data)
            aInstance = ModelA.objects.get(pk=validated_data.get('modelA').id)
            aInstance.counter += 1
            aInstance.save()

        bInstance.save()
        return bInstance

    class Meta:
        model = ModelB
        fields = ['counter']

Я использую drf-nested, а URL-адрес равен

POST /modelA/{model_a_id}/modelB/

Как получить обновленный счетчик ценность? Заранее спасибо.

1 Ответ

0 голосов
/ 28 февраля 2020

Спасибо @ N goc Фам. Решение будет следующим:

class ModelBSerializer(BaseSerializer):
    a = serializers.IntegerField(read_only=True, source='a.counter')

    def create(self, validated_data):
        try:
            bInstance = ModelB.objects.get(a__id=validated_data.get('modelA').id)
            aInstance = ModelA.objects.get(pk=validated_data.get('a').id)
            aInstance.counter = 1
            bInstance.a.counter = aInstance.counter
            aInstance.save()
        except DealThumbsCounter.DoesNotExist:
            bInstance = ModelB.objects.create(**validated_data)
            aInstance = ModelA.objects.get(pk=validated_data.get('modelA').id)
            aInstance.counter += 1
            bInstance.a.counter = aInstance.counter
            aInstance.save()

        bInstance.save()
        return bInstance

    class Meta:
        model = ModelB
        fields = ['counter']
...