Django rest 框架,根据当前 date/time 返回项目状态已预订或免费
Django rest framework, returning item status booked or free based on current date/time
我目前正在为我的学生开发一个网站,帮助他们在课堂上预订一些物品。我已经完成了预订逻辑和表格,因此不允许两个学生同时预订同一项目。我想为他们创建一个 table,它根据当前时间显示项目名称和项目状态。所以我有一个 webpage/django 视图,其中包含所有预订的列表,包括项目名称、开始日期、结束日期和预订该项目的人。因此,基于此预订列表,我想创建一些逻辑来遍历此预订列表并将其与当前 time/date 进行比较。简而言之,如果当前 time/date 介于预订项目的开始日期和结束日期之间,则它应该 return 值“已预订”,否则为“免费”。我不确定如何实现这一目标。我集思广益了好几天,并在互联网上搜索了一些提示,但一无所获。如果有人帮助我,我将非常感激。这是我的模型:
class Items(models.Model):
ITEMS_CATEGORIES=(
('item-1', 'item-1'),
('item-2', 'item-2'),
('item-3', 'item-3'),
('item-4', 'item-4'),
('item-5', 'item-5'),
)
category = models.CharField(max_length=5, choices=ITEM_CATEGORIES)
def __str__(self):
return self.category
class Booking(models.Model):
user = models.CharField(max_length=50, editable=False)
note = models.CharField(max_length=300, default='SOMESTRING')
item = models.ForeignKey(Subsystem, on_delete=models.CASCADE)
check_in = models.DateTimeField()
check_out = models.DateTimeField()
def __str__(self):
return f' {self.item} is booked successfully by {self.user} from {self.check_in.strftime("%d-%b-%Y %H:%M")} to {self.check_out.strftime("%d-%b-%Y %H:%M")} for {self.note} '
所以我想到了类似的东西但是这个代码 100% 是错误的,但是类似于这个
serializers:
class BookingSerializer(serializers.ModelSerializer):
class Meta:
model = Booking
fields = (
'item','check_in','check_out', 'user'
)
current_time = datetime.datetime.now()
/
/
some logic //
if current_time = (check_in and check_out)
return "Booked"
else
return "Free"
您可以使用 SerializerMethodField
添加另一个字段,该字段 returns 来自您需要的计算值:
import django.utils import timezone
class BookingSerializer(serializers.ModelSerializer):
status = serializers.SerializerMethodField()
class Meta:
model = Booking
fields = (
'item', 'check_in', 'check_out', 'user', 'status'
)
def get_status(self, obj):
return 'Booked' if obj.check_in <= timezone.now() < obj.check_out else 'Free'
我目前正在为我的学生开发一个网站,帮助他们在课堂上预订一些物品。我已经完成了预订逻辑和表格,因此不允许两个学生同时预订同一项目。我想为他们创建一个 table,它根据当前时间显示项目名称和项目状态。所以我有一个 webpage/django 视图,其中包含所有预订的列表,包括项目名称、开始日期、结束日期和预订该项目的人。因此,基于此预订列表,我想创建一些逻辑来遍历此预订列表并将其与当前 time/date 进行比较。简而言之,如果当前 time/date 介于预订项目的开始日期和结束日期之间,则它应该 return 值“已预订”,否则为“免费”。我不确定如何实现这一目标。我集思广益了好几天,并在互联网上搜索了一些提示,但一无所获。如果有人帮助我,我将非常感激。这是我的模型:
class Items(models.Model):
ITEMS_CATEGORIES=(
('item-1', 'item-1'),
('item-2', 'item-2'),
('item-3', 'item-3'),
('item-4', 'item-4'),
('item-5', 'item-5'),
)
category = models.CharField(max_length=5, choices=ITEM_CATEGORIES)
def __str__(self):
return self.category
class Booking(models.Model):
user = models.CharField(max_length=50, editable=False)
note = models.CharField(max_length=300, default='SOMESTRING')
item = models.ForeignKey(Subsystem, on_delete=models.CASCADE)
check_in = models.DateTimeField()
check_out = models.DateTimeField()
def __str__(self):
return f' {self.item} is booked successfully by {self.user} from {self.check_in.strftime("%d-%b-%Y %H:%M")} to {self.check_out.strftime("%d-%b-%Y %H:%M")} for {self.note} '
所以我想到了类似的东西但是这个代码 100% 是错误的,但是类似于这个
serializers:
class BookingSerializer(serializers.ModelSerializer):
class Meta:
model = Booking
fields = (
'item','check_in','check_out', 'user'
)
current_time = datetime.datetime.now()
/
/
some logic //
if current_time = (check_in and check_out)
return "Booked"
else
return "Free"
您可以使用 SerializerMethodField
添加另一个字段,该字段 returns 来自您需要的计算值:
import django.utils import timezone
class BookingSerializer(serializers.ModelSerializer):
status = serializers.SerializerMethodField()
class Meta:
model = Booking
fields = (
'item', 'check_in', 'check_out', 'user', 'status'
)
def get_status(self, obj):
return 'Booked' if obj.check_in <= timezone.now() < obj.check_out else 'Free'