Django模型上的动态字段

时间:2019-06-30 16:10:35

标签: django django-models django-rest-framework

我有我的模特。py

class Restaurant(models.Model):
    name = models.CharField(max_length=100, blank=False)
    opening_time = models.TimeField(blank=False)
    closing_time = models.TimeField(blank=False)

    def __str__(self):
        return self.name

    @property
    def is_open(self):
        return (
            True
            if self.opening_time <= datetime.now().time() < self.closing_time
            else False
        )

然后,我的serializer.py:

class RestaurantSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Restaurant
        fields = ('pk', 'name', 'opening_time', 'closing_time')

我在模型中具有is_open属性,用于检查餐厅是否营业。当用户向序列化器API发出GET请求时,使用查询检索对象时,如何运行is_open属性逻辑并更新此字段。

现在,它在创建对象时起作用。在模型上是否可以使用此逻辑放置检索方法?

我当时正在考虑使用Celery来检查它是否打开,但这听起来像是一种过分解决方案。当然,我希望此更改能够影响序列化程序,所以我认为应该在模型上完成此操作。

1 个答案:

答案 0 :(得分:3)

您可以将is_open添加为SerializerMethodField:

class RestaurantSerializer(serializers.HyperlinkedModelSerializer):
    is_open = serializers.SerializerMethodField()

    class Meta:
        model = Restaurant
        fields = ('pk', 'name', 'opening_time', 'closing_time', 'is_open')

    def get_is_open(self, instance):
        return instance.is_open