python - 基于模型类的视图中的调用方法
问题描述
我的模型中有我想在 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。实现这一目标的最佳实践是什么?
谢谢!
解决方案
看起来您唯一的问题是您缺少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
.
推荐阅读
- python - 使用 python 2.7.12 在 Ubuntu 16.04 服务器上进行视频流式传输期间发生错误
- javascript - 显示来自本地 JSON 文件的数据
- php - 二维数组的 AWS API 网关映射模型
- angular - Html2Canvas 只呈现我屏幕的一半
- delphi - 如何设置 Windows Media Player 在特定位置显示帧
- android - 当我在带有数据绑定的 xml 中按“重新格式化代码”时,Android Studio 3.5 更改视图顺序
- symfony - 无法添加“bin/console”命令并在 PhpStorm 的 Xdebug 中运行它
- macos - 无法在 MAC OS 上的 JMeter 中查看侦听器响应正文数据
- javascript - 使浏览器动作模仿服务器请求
- node.js - 使用 kubernetes/client-node 库