как переопределить методы create () и update () для вложенных сериализаторов имеют три внешних ключа - PullRequest
0 голосов
/ 22 июня 2019

Привет всем! Я новичок в Django rest-framework и хочу переопределить обновление и создать метод для трех моделей

model.py

from django.db import models

# Create your models here.

class Subject(models.Model):
    subject_name = models.CharField('Subject',max_length=20)

    def __str__(self):
        return self.subject_name 


class Person(models.Model):
    name = models.CharField(max_length=50)
    age = models.PositiveIntegerField()
    male = models.CharField(max_length=20)
    dob = models.DateField()

    def __str__(self):
        return self.name

class Marks(models.Model):

    subject = models.ForeignKey(Subject , on_delete=models.CASCADE)
    student = models.ForeignKey(Person, related_name = 'marks' , on_delete=models.CASCADE)
    term1 = models.IntegerField()
    term2 = models.IntegerField()
    final = models.IntegerField()

    def __unicode__(self):
        return self.subject

serializers.py

from rest_framework import serializers
from . import models 
from .models import Person, Marks, Subject

class SubjectSerializer(serializers.ModelSerializer):

    class Meta:
        model = Subject
        fields =  "__all__"

class MarksSerializer(serializers.ModelSerializer):

    subject = serializers.CharField()

    class Meta:
        model = Marks
        fields = ('subject','term1','term2','final')
        #depth = 1

class PersonSerializer(serializers.ModelSerializer):

    class Meta:
        model = Person

        fields = ('id', 'name','age', 'male', 'dob')

# making combine serializer for person and marks
class CombineSerializer(serializers.ModelSerializer):

    marks = MarksSerializer(many= True )

    class Meta:
        model = Person

        fields = ('id', 'name','age', 'male', 'dob','marks')

    def create(self, validated_data):
        marks = validated_data.pop('marks')
        subject = marks['subject']
        person = Person.objects.create(**validated_data)

        for marks in marks:
            Marks.objects.create(person=Person, **marks)
        return Marks

Я знаю, как переопределить метод создания для двух моделей, но есть три модели, и все они связаны друг с другом через forign-ключ.Я хочу вставить данные, подобные этой структуре:

[
    {
        "id": 9,
        "name": "javed",
        "age": 2,
        "male": "true",
        "dob": "2019-06-19",
        "marks": [
            {
                "subject": "Maths",
                "term1": 9,
                "term2": 16,
                "final": 8
            }
        ]
    },
...