vic.py
vic.py

Reputation: 409

How create trigger in Django Rest Framework to change booleanfield?

I have a question in django rest framework. Since I'm learning how to use some advanced options, I do not quite understand. I need to currently change a booleanfield every time a foreignkey is inserted into table. How can I do this in model ?

Model:

class Persona(models.Model):
    name = models.CharField(max_length=32)
    cart = models.ForeignKey(Credit,null=True)
    rg = models.IntergerField()
    end = models.CharField(max_length=256)
    details = models.TextField(blank=True, null=True)
    order = models.ForeignKey(Order, null=True)

    def __str__(self):
        return self.cart

    class Meta:
        db_table='person'
        app_label = 'bank'


class Credit(models.Model):
    number = models.CharField(max_length=16, unique=True)
    create_at = models.DateField(auto_add_now=True)
    updated_at = models.DateField()
    available = models.BooleanField()

    def __str__(self):
        return self.number

    class Meta:
        db_table = 'credit'
        app_label = 'bank'

Serializer:

class PersonaSerializer(serializers.ModelSerializer):
    order__id = serializers.ReadOnlyField(source='order.id')


    class Meta:
        model = Persona
        fields = '__all__'


class Persona(viewsets.ModelViewSet):

    allowed_methods = ('GET', 'POST', 'PUT', 'PATCH')
    queryset = Persona.objects.all()
    serializer_class = PersonaSerializer

Upvotes: 0

Views: 1502

Answers (1)

Marcell Erasmus
Marcell Erasmus

Reputation: 914

You can override the create method on the ModelSerializer to achieve this:

def create(self, validated_data):
    cart = validated_data['cart']
    persona = super(PersonaSerializer, self).create(validated_data)
    cart.available = True # update boolean
    cart.save()
    return persona

You can read more about this in the docs

If you want to handle this in your model you can override the Persona model save method:

class Persona(models.Model):
    name = models.CharField(max_length=32)
    cart = models.ForeignKey(Credit,null=True)
    rg = models.IntergerField()
    end = models.CharField(max_length=256)
    details = models.TextField(blank=True, null=True)
    order = models.ForeignKey(Order, null=True)

    def __str__(self):
        return self.cart

    class Meta:
        db_table='person'
        app_label = 'bank'

    def save(self, *args, **kwargs):
        # Will only update the available field when the Persona
        # instance is created and the cart field is not null
        if not self.pk and self.cart:
            self.cart.available = True
            self.cart.save()
        return super(Persona, self).save(*args, **kwargs)

Upvotes: 2

Related Questions