Django rest framework model habit tracker

Я пытаюсь сделать трекер привычек, используя django rest framework в качестве бэкенда и react-native в качестве фронтенда. У меня та же проблема с моделью данных в django. Я хочу создать один экземпляр Daily для каждой даты между датой начала_даты и датой окончания_даты, когда создается трекер. Не могли бы вы мне подсказать, как я могу это сделать? Заранее спасибо.

models.py

from django.db import models
from django.contrib.auth.models import User
from datetime import datetime


class Habit(models.Model):
    title = models.CharField(max_length=32)
    description = models.TextField(max_length=360)


class Tracker(models.Model):
    habit = models.ForeignKey(Habit, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    start_date = models.DateField()
    end_date = models.DateField()
    published = models.BooleanField(default=True)

    def is_active(self):
        today = datetime.now().date()
        return (today >= self.start_date) and (today <= self.end_date)


class Daily(models.Model):
    STATUS = [('DONE', 'DONE'), ('TODO', 'TODO'), ('NOTDONE', 'NOTDONE'),]
    date = models.DateField()
    status = models.CharField(choices=STATUS, max_length=10)
    tracker = models.ForeignKey(Tracker, on_delete=models.CASCADE)

serializers.py

from rest_framework import serializers
from .models import Habit, Tracker, Daily
from django.contrib.auth.models import User
from rest_framework.authtoken.models import Token


class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['id', 'username', 'password']
        extra_kwargs = {'password': {'write_only': True, 'required': True}}

    def create(self, validated_data):
        user = User.objects.create_user(**validated_data)
        Token.objects.create(user=user)
        return user


class HabitSerializer(serializers.ModelSerializer):
    class Meta:
        model = Habit
        fields = ['id', 'title', 'description']


class TrackerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Tracker
        fields = ['id', 'start_date', 'end_date', 'published', 'is_active', 'habit', 'user']


class DailySerializer(serializers.ModelSerializer):
    class Meta:
        model = Daily
        fields = ['id', 'date', 'status', 'tracker']

views.py

from rest_framework import viewsets
from django.contrib.auth.models import User
from .models import Habit, Tracker, Daily
from .serializers import HabitSerializer, TrackerSerializer, DailySerializer, UserSerializer


class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer


class HabitViewSet(viewsets.ModelViewSet):
    queryset = Habit.objects.all()
    serializer_class = HabitSerializer


class TrackerViewSet(viewsets.ModelViewSet):
    queryset = Tracker.objects.all()
    serializer_class = TrackerSerializer

class DailyViewSet(viewsets.ModelViewSet):
    queryset = Daily.objects.all()
    serializer_class = DailySerializer

Я бы рекомендовал принудительную проверку уникальности ('tracker', 'date') на модели Daily через unique_together. Затем используйте сигнал post_save для создания приемника для поиска вновь созданного экземпляра Tracker, затем создайте экземпляры Daily для каждой из дат между диапазоном. Вы можете использовать bulk_create, чтобы сделать это за меньшее количество запросов, если вы ожидаете, что диапазон будет большим.

Вернуться на верх