I have classes Pessoas
, Profissoes
, ProfissoesPessoa
and QualificacoesProfissoesPesssoa
In theory, my Models are as follows:
# -*- 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 looks like this:
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 looks like this:
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 getting it.