Логика метода django, связанная с моделью с DRF
Я изучаю Django/DRF, и у меня есть понимание большинства концепций, но я не знаю ответа на этот вопрос, и я не могу найти ответ в интернете. Вот модель (не обращайте внимания на то, что id - это поле символов, которое не инкрементируется автоматически)
class Competition(models.Model):
id = models.CharField(primary_key=True, max_length=7)
buyer = models.ForeignKey(Buyer, on_delete=models.CASCADE,related_name='competition_buyer_id')
name = models.CharField(max_length=200)
open = models.DateTimeField()
closed = models.DateTimeField()
minimum_capacity = models.IntegerField()
currency = models.CharField(max_length=5)
У меня есть логика, связанная с этой моделью, которую я поместил в папку utils внутри этого приложения
from django.utils import timezone
class CompetitionHandler:
def get_state_based_on_open_and_closed_dates(self, open_date_object, closed_date_object):
state = None
if open_date_object > timezone.now() and closed_date_object > timezone.now():
state = 'pending'
if open_date_object < timezone.now() and closed_date_object > timezone.now():
state = 'open'
if open_date_object < timezone.now() and closed_date_object < timezone.now():
state = 'closed'
return state
def main():
CompetitionHandler()
if __name__ == '__main__':
main()
затем я вызвал его в сериализаторе для этой модели следующим образом:
from buyer.serializers import BuyerSerializer
from competition.models import Competition
from rest_framework import serializers
from business_logic.competition import CompetitionHandler
class CompetitionSerializer(serializers.ModelSerializer):
status = serializers.SerializerMethodField()
buyer = BuyerSerializer('buyer')
class Meta:
model = Competition
fields = '__all__'
def get_status(self, competition):
competition_handler = CompetitionHandler()
state = competition_handler.get_state_based_on_open_and_closed_dates(
competition.open, competition.closed)
Является ли это плохой практикой? Что было бы лучшим django/django restframework для реализации этой логики? Должно ли это быть в модели, а не в папке utils? Где я должен вызвать это в сериализаторе или я должен был найти способ добавить это в модель в качестве поля, чтобы получить статус в базе данных? В общем, я просто не знаю лучшего подхода к этому сценарию и был бы очень признателен за ответ о том, какова наилучшая практика для этого в примере? И если это должен быть метод в модели, то где я должен его вызывать? И если в этом случае это должен быть метод в модели, то когда вы проведете черту, прежде чем поместить его в папку utils/services?