Динамическое поле на модели Джанго - PullRequest
0 голосов
/ 30 июня 2019

У меня есть мой models.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 в модели, которое проверяет, открыт ли ресторан.Как я могу запустить логику свойства is_open и обновить это поле, когда объект извлекается с использованием запроса о том, когда пользователь делает запрос GET к API сериализатора.

Прямо сейчас, это работает, когда объектсоздано.Есть ли в модели метод извлечения, в который я могу поместить эту логику?

Я думал об использовании Celery, чтобы проверить, открыт ли он, но это звучит как решение с избыточным убийством.Конечно, я бы хотел, чтобы это изменение повлияло на сериализатор, поэтому я думаю, что это должно быть сделано в модели.

1 Ответ

3 голосов
/ 30 июня 2019

Вы можете добавить 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
...