首页 > 解决方案 > 基于模型类的视图中的调用方法

问题描述

我的模型中有我想在 API 中调用的方法。

模型:

class Booking(models.Model):
    PENDING = 'PN'
    ACCEPTED = 'AC'
    DENIED = 'DN'
    BOOKING_STATUS_CHOICES = [
        (PENDING, 'Pending'),
        (ACCEPTED, 'Accepted'),
        (DENIED, 'Denied')
    ] 
    createdDate = models.DateTimeField(auto_now_add=True)
    comments = models.CharField(max_length=120)
    location = models.TextField()
    date = models.DateTimeField()
    operator = models.ForeignKey("Business", on_delete=models.CASCADE)
    status = models.CharField(max_length=2, choices=BOOKING_STATUS_CHOICES,default=PENDING)

    def __str__(self):
        return self.comments
    
    def acceptBooking(self):
        self.status = self.ACCEPTED

    def denyBooking(self):
        self.status = self.DENIED

序列化器:

class BookingSerializer(serializers.ModelSerializer):
    class Meta:
        model = Booking
        fields = ('createdDate', 'comments', 'location', 'date', 'operator', 'status')

意见:

class BookingView(viewsets.ModelViewSet):
    serializer_class = BookingSerializer
    queryset = Booking.objects.all()
    filter_backends = [filters.SearchFilter]
    search_fields = ['createdDate', 'comments', 'location', 'date', 'operator']

我想调用acceptBooking 或denyBooking。实现这一目标的最佳实践是什么?

谢谢!

标签: pythondjangodjango-modelsdjango-rest-frameworkdjango-views

解决方案


看起来您唯一的问题是您缺少self.save()模型功能。序列化程序会自动为您保存状态,而不需要所需的功能。

如果这不是您要查找的内容并且您想调用函数,那么正如@Ram 提到的,请查看如何调用模型字段。对你来说,这将是:

class BookingView(viewsets.ModelViewSet):
    serializer_class = BookingSerializer
    queryset = Booking.objects.all()
    filter_backends = [filters.SearchFilter]
    search_fields = ['createdDate', 'comments', 'location', 'date', 'operator']

    def perform_update(self, serializer):
        serializer.save()
        if <accept_check>:
            serializer.instance.acceptBooking()

        if <deny_check>:
            serializer.instance.denyBooking()

您还必须保存对模型功能的更改,例如:

    def acceptBooking(self):
        self.status = self.ACCEPTED
        self.save()

    def denyBooking(self):
        self.status = self.DENIED
        self.save()

请注意函数应该使用下划线,所以acceptBooking应该是accept_booking.


推荐阅读