【问题标题】:Django rest framework, returning item status booked or free based on current date/timeDjango 休息框架,根据当前日期/时间返回已预订或免费的项目状态
【发布时间】:2021-09-18 12:09:41
【问题描述】:

我目前正在为我的学生开发一个网站,该网站将帮助他们在课堂上预订一些物品。我已经完成了预订逻辑和表格,因此不允许两个学生同时预订同一个项目。我想为他们创建一个表格,在其中显示项目名称和基于当前时间的项目状态。所以我有一个网页/django 视图,其中包含所有预订的列表,包括项目名称、开始日期、结束日期和预订项目的人。因此,基于此预订列表,我想创建一些逻辑来遍历此预订列表并将其与当前时间/日期进行比较。简而言之,如果当前时间/日期介于预定项目的开始日期和结束日期之间,它应该返回值“已预订”,否则返回“免费”。我不确定如何实现这一目标。我头脑风暴了几天,在互联网上搜索了一些提示,但一无所获。如果有人帮助我,我将非常感激。这是我的模型:

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"

【问题讨论】:

    标签: python django django-rest-framework logic


    【解决方案1】:

    您可以使用SerializerMethodField 添加另一个字段,该字段从您需要的计算中返回一个值:

    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'
    

    【讨论】:

    • 嘿,当我运行代码时,我收到此错误:“无法比较 offset-naive 和 offset-aware datetimes”。
    • 已更新。尝试使用timezone.now()
    • 非常感谢,它成功了。我有一个快速的问题。请注意我是 Django 新手,我可以在另一个序列化程序中导入这个序列化程序吗?这样这个序列化程序的字段就会显示在那里,即使两者都来自不同的模型?
    • 是的,你可以。只要该其他模型具有check_incheck_out 字段。此外,您还需要在其他序列化程序中将状态定义为字段
    • 嗯,这不能完全使用外键。这两个字段在另一个模型中也需要是DateTimeFields
    猜你喜欢
    • 2021-06-05
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 2021-11-20
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多