DRF: как вставить данные в другой класс модели при удалении в классе модели - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь вставить данные в один модальный класс при уничтожении другого класса модели. Мой первый класс модели:

class UserDevice(models.Model):
    type = models.ForeignKey(
        'Device',
        on_delete=models.CASCADE
    )
    hardware_serial = models.CharField(max_length=255)
    created_at = models.DateTimeField(auto_now_add=True)

class NewDevice(models.Model):
    type = models.ForeignKey(
        'Device',
        on_delete = models.CASCADE
    )
    hardware_serial = models.CharField(max_length=255)
    created_at = models.DateTimeField(auto_now_add=True)

Каждый раз, когда я уничтожаю UserDevice, я хочу, чтобы это же устройство было добавлено в NewDevice

Мой класс сериализатора:

class UserDeviceSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.UserSensorDevice
        fields = '__all__'
        read_only_fields = ['id','created_at']

    def create(self, validated_data):
        app_id = models.UserDevice.objects.filter(sensor_code= validated_data.get('hardware_serial', None)).first()
        if app_id:
            msg = _('Application ID is already registered')
            raise serializers.ValidationError(msg, code='authorization')
        else :
            return models.UserDevice.objects.create(**validated_data)

class NewDeviceSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.NewDevice
        fields = '__all__'
        read_only_fields = ['id','created_at']

Мой класс представления:

class UserSensorRemoveDevice(generics.DestroyAPIView):
    authentication_classes = (authentication.TokenAuthentication,)
    permission_classes = (permissions.IsAuthenticated,)
    queryset = models.UserDevice.objects.all()
    serializer_class = serializers.UserDeviceSerializer

То, что я пытался переопределить, уничтожить UserDevice. Но почему-то это не работает:

def destroy(self, validated_data):
        return models.NewDevice.objects.create(type = validated_data.get('type', None),hardware_serial = validated_data.get('hardware_serial', None))

Любая помощь будет принята с благодарностью. Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 29 мая 2020

Вы можете изменить UserDevice.delete() метод

class UserDevice(models.Model):

    ...

    def delete(self, *args, **kwargs):
        NewDevice.objects.create(type=self.type, hardware_serial=self.hardware_serial)
        super().delete(*args, **kwargs)
0 голосов
/ 29 мая 2020

in может просто переопределить функцию удаления UserDevice вашей модели

def delete(self, using=None, keep_parents=False):
    #add new NewDevice instance
    super().delete(using, keep_parents,*args,**kwargs)
...