Как создать триггер в Django Rest Framework для изменения логического поля? - PullRequest
0 голосов
/ 21 сентября 2018

У меня вопрос в рамках отдыха django.Поскольку я учусь использовать некоторые дополнительные параметры, я не совсем понимаю.В настоящее время мне нужно менять логическое поле каждый раз, когда в таблицу вставляется чужой ключ.Как я могу сделать это в модели?

Модель:

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

1 Ответ

0 голосов
/ 21 сентября 2018

Вы можете переопределить метод 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)
...