How to get nested Rest?

Asked

Viewed 98 times

1

I happen to have the classes Pessoas, Profissoes, ProfissoesPessoa and QualificacoesProfissoesPesssoa

In thesis my Models is so below:

    # -*- coding: utf-8 -*-
from django.db import models
from django.contrib.auth.models import User
#from __future__ import unicode_literals


class Pessoa(models.Model):# TA FEITO
    username = models.OneToOneField(User, blank=True, null=True)
    nomepessoa = models.CharField('Nome', max_length=100, null=False, blank=False)
    sobrenomepessoa = models.CharField('Sobrenome', max_length=100, null=False, blank=False)
    tipologradouro = models.CharField('Tipo Logradouro', max_length=100, null=False, blank=False)
    logradouro = models.CharField('Logradouro', max_length=100)
    numero = models.IntegerField('Número', null=False, blank=False)
    bairro = models.CharField('Bairro', max_length=50, null=False, blank=False)
    cidade = models.CharField('Cidade', max_length=50, null=False, blank=False)
    estado = models.CharField('estado', max_length=10, null=False, blank=False)
    longitude = models.FloatField('Longitude', null=True, blank=True)
    latitude = models.FloatField('Latitude', null=True, blank=True)
    #profissao = models.ManyToManyField('Profissao', through='ProfissoesPessoa', related_name='pessoas')

    class Meta:
        verbose_name_plural = 'pessoas'
        verbose_name = 'pessoa'


    def __str__(self):
        return self.nomepessoa


class Profissao(models.Model):# TA FEITO
    profissao = models.CharField(max_length=100,null=False, blank=False)


    class Meta:
        verbose_name_plural = 'profissões'
        verbose_name = 'profissão'


    def __str__(self):
        return self.profissao


class ProfissoesPessoa(models.Model):# TA FEITO
    pessoa = models.ForeignKey(Pessoa, related_name='profissoesPessoa')#, related_name='pessoa'
    profissoes = models.ForeignKey(Profissao)#, related_name='profissoes'
    rating = models.DecimalField(max_digits=5, decimal_places=2, default=0, null=False, blank=False)


    class Meta:
        unique_together = ("pessoa", "profissoes")
        verbose_name_plural = 'profissoes da pessoa'
        verbose_name = 'profissão da pessoa'


    def __unicode__(self):
        return "%s is in profissoes %s (as %s)" % (self.pessoa, self.profissoes, self.type)


    def __str__(self):
        return self.profissoes.profissao

    def nomepessoa(self):
        return self.pessoa.nomepessoa

class Comentarios(models.Model):# TA FEITO
    profissaopessoa = models.ForeignKey(ProfissoesPessoa)
    comentario = models.TextField(max_length=200,null=False, blank=False)
    rating = models.DecimalField(max_digits=5, decimal_places=2, default=0, null=False, blank=False)


    class Meta:
        #unique_together = ("pessoa", "profissoes")
        verbose_name_plural = 'comentários dos profissionais'
        verbose_name = 'comentários do profissional'

    def nomepessoa(self):
        return self.profissaopessoa.pessoa.nomepessoa

class Qualificacoes(models.Model):
    profissaopessoa = models.ManyToManyField('ProfissoesPessoa')
    descricao = models.CharField(max_length=100, null=False, blank=False)

    class Meta:
        verbose_name_plural= 'Qualificações'
        verbose_name = 'Qualificação'

My Views are as below:

import requests
from django.contrib.auth.models import User
from django.shortcuts import render
from sosmypc.core.forms import TecnicoForm

from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.renderers import JSONRenderer
from rest_framework.response import Response
from rest_framework.decorators import api_view
from rest_framework.parsers import JSONParser
from sosmypc.core.models import Pessoa
from sosmypc.core.serializers import PessoaSerializer


# Create your views here.


from sosmypc.core.models import Pessoa#, Qualificacao, Tecnico



class JSONResponse(HttpResponse):
    """
    An HttpResponse that renders its content into JSON.
    """
    def __init__(self, data, **kwargs):
        content = JSONRenderer().render(data)
        kwargs['content_type'] = 'application/json'
        super(JSONResponse, self).__init__(content, **kwargs)


#@csrf_exempt
@api_view(['GET','POST'])
def pessoa_list(request):
    """
    List all code pessoas, or create a new pessoa.
    """
    if request.method == 'GET':
        pessoas = Pessoa.objects.all()
        serializer = PessoaSerializer(pessoas, many=True)
        #return JSONResponse(serializer.data)
        return Response(serializer.data)

    elif request.method == 'POST':
        data = JSONParser().parse(request)
        serializer = PessoaSerializer(data=data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)


@csrf_exempt
def pessoa_detail(request, pk):
    """
    Retrieve, update or delete a code pessoa.
    """
    try:
        pessoa = Pessoa.objects.get(pk=pk)
    except Pessoa.DoesNotExist:
        return HttpResponse(status=404)

    if request.method == 'GET':
        serializer = PessoaSerializer(pessoa)
        return JSONResponse(serializer.data)

    elif request.method == 'PUT':
        data = JSONParser().parse(request)
        serializer = PessoaSerializer(pessoa, data=data)
        if serializer.is_valid():
            serializer.save()
            return JSONResponse(serializer.data)
        return JSONResponse(serializer.errors, status=400)

    elif request.method == 'DELETE':
        pessoa.delete()
        return HttpResponse(status=204)

And my serializer is like this below:

from rest_framework import serializers
from sosmypc.core.models import *


class Qualificacoes(serializers.ModelSerializer):

    qualificacoes = serializers.StringRelatedField(many=True)

    class Meta:
        model = Qualificacoes
        fields = ('id','profissoes','rating')



class ProfissoesPessoaSerializer(serializers.ModelSerializer):
    profissoesPessoa = serializers.StringRelatedField(many=True, read_only=True)

    class Meta:
        model = ProfissoesPessoa
        fields = ('id','profissoespessoa','descricao', 'qualificacoes')




class PessoaSerializer(serializers.ModelSerializer):


    class Meta:
        model = Pessoa
        fields = ('id', 'nomepessoa', 'tipologradouro', 'logradouro', 'numero', 'bairro', 'cidade', 'estado', 'longitude', 'latitude','profissoesPessoa')


    def create(self, validated_data):
        """
        Create and return a new `Snippet` instance, given the validated data.
        """
        return Pessoa.objects.create(**validated_data)

    def update(self, instance, validated_data):
        """
        Update and return an existing `Snippet` instance, given the validated data.
        """
        instance.nomepessoa = validated_data.get('nomepessoa', instance.title)
        instance.sobrenomepessoa = validated_data.get('sobrenomepessoa', instance.code)
        instance.tipologradouro = validated_data.get('tipologradouro', instance.linenos)
        instance.logradouro = validated_data.get('logradouro', instance.language)
        instance.numero = validated_data.get('numero', instance.style)
        instance.bairro = validated_data.get('bairro', instance.style)
        instance.cidade = validated_data.get('cidade', instance.style)
        instance.estado = validated_data.get('estado', instance.style)
        instance.longitude = validated_data.get('longitude', instance.style)
        instance.latitude = validated_data.get('latitude', instance.style)

        instance.save()
        return instance

All I wanted was to generate a json with people, each person can have one or more professions and each profession can have many qualifications.

I’m not making it.

  • Start by identifying your classes in the question, they’re all piled up, you can’t tell which is which.

  • Gee, I’m sorry. .

No answers

Browser other questions tagged

You are not signed in. Login or sign up in order to post.