=models.CASCADE)
    email = models.EmailField(null=True)

    def __str__(self):
        return self.user.firstName +'' + self.user.lastName

class Student(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True, default=None)
    batch = models.ForeignKey(Batch, on_delete=models.CASCADE, null=True, related_name='students')
    age = models.IntegerField(blank=True)

    @property
    def remarks(self):
        return self.remark_set.all()

    @property
    def marks(self):
        return self.marks_set.all()

    def __str__(self):
        return self.user.firstName +'' + self.user.lastName

class Attendance(models.Model):
    Subject = models.ForeignKey(Subject, on_delete=models.CASCADE, null=True)
    class_date = models.DateField(blank=True, null=True)
    student = models.ForeignKey(Student, related_name='student_today', on_delete=models.CASCADE, null=True)
    present = models.NullBooleanField(default=False)

    def __str__(self):
        return str(self.class_date) + '_' + str(self.student.user.username) + '_' + str(self.Subject.name)

 serilaizers.py
class BasicUserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('firstName', 'lastName')


class BasicStudentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Student
        fields = ('batch', 'age')


class ParentSerializer(serializers.ModelSerializer):
    user = BasicUserSerializer(read_only=True, many=False)
    child = BasicStudentSerializer(read_only=True,  many= False)

    class Meta:
        model = Parent
        fields = "__all__"

 views.py
class ParentView( mixins.ListModelMixin, mixins.RetrieveModelMixin,viewsets.GenericViewSet):
    queryset = Parent.objects.all()
    serializer_class = serializers.ParentSerializer

World of Wanderlust: How to Live an Adventurous Life by Brooke Saward : This is 100% on the very top of my Christmas list. Brooke, one of my favorite travel bloggers, never ceases to inspire me with her wanderlust and travels all over the world. Even more, she wrote a book and opened a dessert house. She truly is goals. And bonus: she has an Australian accent!!
World Leather Journal : With a full schedule of upcoming travel, I definitely want to remember my trips in a classy way. While I usually just use a simple spiral notebook, I hope I’ll be able to treat myself with a fancy leather journal to keep my memories for years to come. If you’re not ready for the commitment of a leather journal, here’s a more inexpensive and casual option from Target.
Macaroons Stationery : Some of the things I love most in life: travel, French, cats and, of course, fun stationery! I’ve had my eyes on this particular stationery from Barnes and Noble for literally months. So cute and very unique. And who doesn’t like opening an envelope with a macaroon card on the inside?!
Long Champs bag : I can only stay away from Europe so long, which means, of course, I need a bag from a French company. Cute and spacious? Oui oui. Do as the French do, eh?
Passport Cover: I’ve been travel blogging for almost two years and have never owned a passport cover. How sad… But I’m low-key obsessed with this one from ban.do.
Stickers : This won’t make it to my Christmas list because I already bought 6 stickers from this site! You will spend more time on this site than you actually have because there’s literally a sticker for everything, and they have sales (woot!). These are perfect because a) you can find just about anything under the sun and b) they’re not incredibly expensive. I checked my mailbox probably four times on the day they were supposed to arrive and ripped open the package before I even got to my room because these stickers are CUTE.
Graphic tees : I’m really not a t-shirt person. But I want to be stylish and comfortable when I’m jet setting. Look for fun graphic tees—sophisticated with a flair of personality (and comfort!). I really like this one from ban.do!
What do you plan on buying for the traveler in your life?
// CONSTANTS
var margin = {
    top: 15,
    right: 20,
    bottom: 20,
    left: 20
};

// var barHeight = 12;
// var barSpace = 12; // Vertical space between bars
// var barCurve = 5; // Radius curve at bar corners
// var minBar = 7; // minimum bar length on hover
// var ttime = 800; // duration for movement transitions

var barHeight = 8;
var barSpace = 6; // Vertical space between bars
var barCurve = 3; // Radius curve at bar corners
var minBar = 7; // minimum bar length on hover
var ttime = 800; // duration for movement transitions
// var mergedToggle = true;

// Global variables
var w = 1000; // default width--code should overwrite
var h = 1000; // default height--code should overwrite
var max = 1; // Maximum number of rows - not yet set
var xScale; // Converts from time (ms?) to pixels
var yScale; // Converts from row number to pixels
var critPath = []; // bars and lines on the critical path
var oCritPath;
//var critOn = false; // critical path visibility
//var allVisible = false; // all dependency lines visibility
var edit = false; // detail edit mode status
//var htmlTxt = "";
var jsdeps = []; // asynchronized javascript dependencies
var dataHash = {};
var deps = [];
var dataset = [];
var ads_toggle = false;
var ad_objects = new Set(); // Set to store the objects to remove
var ad_domains = new Set(); // Set of domain names to query from
var orig_dataset = {};
var first = true;


/*
 * Function to register the SVG
 * id- ID of the SVG
 * d- data
 */
function svg(d, id) {
    // Register canvas
    orig_dataset = d;
    svg.registercanvas(id, this);
    this.dataset = d["data"];
    this.deps = d["deps"];
    this.dataHash = d["dataHash"];
    this.critPath = d["critPath"];
    if (this.critPath){
      this.download0Id = this.critPath[0];
    }
    this.segmentRows = d['segmentRows'];
    this.rowMapHash = {};
    this.mappedMaxRow = 0;
    critPath = this.critPath;

    this.loadTime = d["loadTime"];
    this.onLoad = d["onLoad"];
    this.firstMeaningfulPaint = d["firstMeaningfulPaint"];
    this.firstContentfulPaint = d["firstContentfulPaint"];
    this.firstPaint = d["firstPaint"];
    this.domContentLoadedEventEnd = d["domContentLoadedEventEnd"];
    this.timeToInteractive = d["timeToInteractive"];
    // this.computationTime = d["computationTime"];
    // this.networkingTime = d["networkingTime"];
    // this.onLoad = 10000;
    // this.firstMeaningfulPaint = 2000;
    // this.firstContentfulPaint = 4000;
    // this.firstPaint = 1500;
    // this.domContentLoadedEventEnd = 5000;
    // this.computationTime = 2000;
    // this.networkingTime = 8000;
    //this.htmlSource = d["htmlSource"] + ".html";
    this.svgId = id;
    this.svg = document.getElementById(id);

    // max : total number of rows : last row's download_group
    max = this.dataset[this.dataset.length - 1].download_group;

    // Width: Window width
    w = parseInt(d3.select("#parent").style("width"), 10) - margin.left - margin.right;
    // console.log('w:'+ w);
    // console.log('max:'+ max);
    // Height: maximum number of rows * space per bar
    h = max * (barHeight + barSpace);
    // console.log('    h = max * (barHeight + barSpace