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
, чтобы сделать это за меньшее количество запросов, если вы ожидаете, что диапазон будет большим.