Каждый раз, когда создается или обновляется одна модель, я хочу, чтобы она вставляла/изменяла другую модель (один к одному).
Когда создается или изменяется "Заметка", я хочу, чтобы она анализировала ее content
и решала, нужно ли создать, обновить или удалить соответствующую запись в "Обзоре".
Я в некотором замешательстве, как это сделать. Должен ли я переопределить функцию save(), чтобы поместить туда эту логику? Какую функцию save() я должен переопределить - Models, Serializer или Views? Кто-нибудь может показать мне пример того, как связать изменения в заметке с созданием/изменением записи в Review?
Models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
from django.conf import settings
class Note(models.Model):
title = models.CharField(max_length=1000, blank=True)
content = models.TextField()
date_created = models.DateTimeField(auto_now=False,auto_now_add=True)
date_updated = models.DateTimeField(auto_now=True,auto_now_add=False)
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
class Review(models.Model):
note = models.OneToOneField(Note, on_delete=models.CASCADE, primary_key=True)
easiness = models.DecimalField(decimal_places=3,max_digits=6)
interval = models.IntegerField()
repetitions = models.IntegerField()
due_date = models.DateField(auto_now=False,auto_now_add=False)
last_reviewed = models.DateField(auto_now=True,auto_now_add=False)
class User(AbstractUser):
pass
# Create your models here.
Serializers.py
class NoteSerializer(serializers.ModelSerializer):
#title = serializers.CharField(max_length=1000, required=False)
class Meta:
model = models.Note
fields = ('id','title','content','date_created','date_updated','author')
class ReviewSerializer(serializers.ModelSerializer):
note = NoteSerializer(read_only=True)
class Meta:
model = models.Review
fields = ('easiness', 'repetitions', 'interval', 'due_date', 'last_reviewed', 'note')
views.py
class NoteViewSet(viewsets.ModelViewSet):
queryset = models.Note.objects.all()
serializer_class = NoteSerializer
permission_classes = (IsAuthenticated,)
def list(self, request):
queryset = self.queryset.filter(author=request.user.id)
serial = NoteSerializer(queryset, many=True)
return Response(serial.data)
def create(self, request):
title = extract_title(request.data['content'])
rez = {**request.data,'title':title, 'author':request.user.id}
serial = NoteSerializer(data=rez)
if serial.is_valid():
serial.save()
return Response(serial.data, status=status.HTTP_201_CREATED)
return Response(serial.errors, status=status.HTTP_400_BAD_REQUEST)
def update(self, request, pk=None):
title = extract_title(request.data['content'])
current_post = models.Note.objects.get(id=pk)
rez = {**request.data,'title':title, 'author':request.user.id}
serial = NoteSerializer(current_post, data=rez)
if serial.is_valid():
serial.save()
return Response(serial.data)
return Response(serial.errors, status=status.HTTP_400_BAD_REQUEST)