首页 > 解决方案 > 如何在 Django Rest Framework 中创建触发器来更改布尔字段?

问题描述

我在 django rest 框架中有一个问题。由于我正在学习如何使用一些高级选项,所以我不太明白。每次将外键插入表时,我当前都需要更改布尔字段。我怎样才能在模型中做到这一点?

模型:

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'

序列化器:

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

标签: djangodjango-modelsdjango-rest-framework

解决方案


您可以覆盖上的create方法ModelSerializer来实现此目的:

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

您可以在文档中阅读更多相关信息

如果你想在你的模型中处理这个,你可以覆盖 Persona 模型save方法:

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)

推荐阅读