У меня следующая проблема, и я не знаю почему, потому что я отправляю:% self._get_set_deprecation_msg_params (), TypeError: Прямое назначение обратной стороне связанного набора запрещено. Вместо этого используйте AuditedClientPeriodMatrices.set ().
Не могли бы вы мне помочь?
JSON
{
"clientName": "PRUEBA",
"AuditedClientPeriods":
[
{
"clientNamePeriod": "PRUEBA",
"AuditedClientPeriodMatrices": [
{
"AuditedClientPeriodMatrizDatas": []
}
]
}
]
}
serializers.py
from rest_framework import serializers
from ...models import Audited_Client, Audited_Client_Period, Audited_Client_Period_Matriz, Audited_Client_Period_Matriz_Data
class AuditedClientPeriodMatrizDataSerializer(serializers.ModelSerializer):
class Meta:
model = Audited_Client_Period_Matriz_Data
fields = [
'id',
'clientName',
'clientNamePeriod',
'ANIO',
'MES',
'GRUPO',
'DOCUMENTO_MATRIZ',
'NOMBRE_MATRIZ',
'DOCUMENTO_CLIENTE',
'NOMBRE_CLIENTE',
'CNAE_ACTIVIDAD',
'SEGMENTO_IRB',
'ID_EXPEDIENTE',
'IND_DRC',
'SEGMENTO_DRC_S_CIRCULAR',
'TIPO_OPERACION_SUBTIPO_IRB',
'COD_INSOLVENCIA',
'CLASIFICACION',
'CONCEDIDO',
'DPTO_NORMAL',
'DPTO_VIG_ESPECIAL',
'DPTO_DUDOSO',
'DPTO_MUY_DUDOSO',
'DPTO_TOTAL'
]
class AuditedClientPeriodMatrizSerializer(serializers.ModelSerializer):
#Ojo esta variable esta en related_name en models.py
AuditedClientPeriodMatrizDatas = AuditedClientPeriodMatrizDataSerializer(many=True)
class Meta:
model = Audited_Client_Period_Matriz
fields = [
'id',
'clientName',
'clientNamePeriod',
'matriz',
'author_matriz_audited_client_period',
'created_matriz',
'updated_matriz',
'AuditedClientPeriodMatrizDatas'
]
class AuditedClientPeriodSerializer(serializers.ModelSerializer):
#Ojo esta variable esta en related_name en models.py
AuditedClientPeriodMatrices = AuditedClientPeriodMatrizSerializer(many=True)
class Meta:
model = Audited_Client_Period
fields = [
'id',
'clientName',
'clientNamePeriod',
'author_audited_client_period',
'created_audited_client_period',
'updated_audited_client_period',
'AuditedClientPeriodMatrices'
]
class AuditedClientSerializer(serializers.ModelSerializer):
#Ojo esta variable esta en related_name en models.py
AuditedClientPeriods = AuditedClientPeriodSerializer(many=True)
class Meta:
model = Audited_Client
fields = [
'id',
'clientName',
'author_audited_client',
'created_audited_client',
'updated_audited_client',
'AuditedClientPeriods'
]
#validated_data es un diccionario
# y .pop(key) busca la clave especificada y la devuelve y la elimina si se encuentra, de lo contrario se genera una excepción.
def create(self, validated_data):
username = validated_data.get('author_audited_client', None)
AuditedClientPeriods = validated_data.pop('AuditedClientPeriods')
AuditedClient = Audited_Client.objects.create(**validated_data)
for AuditedClientPeriod in AuditedClientPeriods:
Audited_Client_Period.objects.create(**AuditedClientPeriod, clientName=AuditedClient, author_audited_client_period=username)
return AuditedClient
def update(self, instance, validated_data):
instance.clientName = validated_data.get('clientName', instance.clientName)
instance.save()
return instance
моделей. py
from django.db import models
from django.contrib.auth.models import User
from django.conf import settings
# blank=True: Le decimos que puede ser un campo que este en blanco
# null=True: Le decimos que puede ser un campo nullo sin nada
# auto_now_add: se aniadira al crear la instancia la primera vez
# auto_now: se actualizara cuando lo modifiquemos
class Audited_Client(models.Model):
clientName = models.CharField(max_length=128, null=False, blank=False, unique=True, verbose_name="Client Name")
author_audited_client = models.ForeignKey(User, null=True, blank=True, on_delete=models.CASCADE, verbose_name="Author audited client")
created_audited_client = models.DateTimeField(auto_now=False, auto_now_add=True, verbose_name="Created audited client")
updated_audited_client = models.DateTimeField(auto_now=True, auto_now_add=False, verbose_name="Updated audited client")
class Meta:
verbose_name = "Audited Client"
verbose_name_plural = "Audited Clients"
ordering = ["-created_audited_client"]
class Audited_Client_Period(models.Model):
clientName = models.ForeignKey(Audited_Client, null=True, blank=True, related_name='AuditedClientPeriods', on_delete=models.CASCADE, verbose_name="Client Name")
clientNamePeriod = models.CharField(max_length=128, null=False, blank=False, unique=True, verbose_name="Client Name Period")
author_audited_client_period = models.ForeignKey(User, null=True, blank=True, on_delete=models.CASCADE, verbose_name="Author audited client period")
created_audited_client_period = models.DateTimeField(auto_now=False, auto_now_add=True, verbose_name="Created audited client period")
updated_audited_client_period = models.DateTimeField(auto_now=True, auto_now_add=False, verbose_name="Updated audited client period")
class Meta:
verbose_name = "Audited Client Period"
verbose_name_plural = "Audited Clients Period"
ordering = ["-created_audited_client_period"]
class Audited_Client_Period_Matriz(models.Model):
clientName = models.ForeignKey(Audited_Client, null=True, blank=True, related_name='AuditedClientPeriodMatrices', on_delete=models.CASCADE, verbose_name="Client Name")
clientNamePeriod = models.ForeignKey(Audited_Client_Period, null=True, blank=True,related_name='AuditedClientPeriodMatrices', on_delete=models.CASCADE, verbose_name="Client Name Period")
matriz = models.FileField(upload_to=settings.MEDIA_APP_ANALISIS_EXPEDIENTES_FILES,unique=True, blank=True, null=True, max_length=500)
author_matriz_audited_client_period = models.ForeignKey(User, null=True, blank=True, on_delete=models.CASCADE, verbose_name="Author matriz audited client period")
# auto_now_add: se aniadira al crear la instancia la primera vez
created_matriz = models.DateTimeField(auto_now=False, auto_now_add=True)
#auto_now: se actualizara cuando lo modifiquemos
updated_matriz = models.DateTimeField(auto_now=True,auto_now_add=False)
class Meta:
verbose_name = "Matriz Audited Client Period"
verbose_name_plural = "Matrices Audited Clients Period"
ordering = ["-created_matriz"]
class Audited_Client_Period_Matriz_Data(models.Model):
clientName = models.ForeignKey(Audited_Client, null=True, blank=True, related_name='AuditedClientPeriodMatrizDatas', on_delete=models.CASCADE, verbose_name="Client Name")
clientNamePeriod = models.ForeignKey(Audited_Client_Period, null=True, blank=True, related_name='AuditedClientPeriodMatrizDatas', on_delete=models.CASCADE, verbose_name="Client Name Period")
matriz = models.ForeignKey(Audited_Client_Period_Matriz, blank=True, null=True, related_name='AuditedClientPeriodMatrizDatas', on_delete=models.CASCADE, max_length=500, verbose_name="Client Name Period Matriz")
ANIO = models.CharField(max_length=128, null=True, blank=True)
MES = models.CharField(max_length=128, null=True, blank=True)
GRUPO = models.CharField(max_length=128, null=True, blank=True)
DOCUMENTO_MATRIZ = models.CharField(max_length=128, null=True, blank=True)
NOMBRE_MATRIZ = models.CharField(max_length=128, null=True, blank=True)
DOCUMENTO_CLIENTE = models.CharField(max_length=128, null=True, blank=True)
NOMBRE_CLIENTE = models.CharField(max_length=128, null=True, blank=True)
CNAE_ACTIVIDAD = models.CharField(max_length=128, null=True, blank=True)
SEGMENTO_IRB = models.CharField(max_length=128, null=True, blank=True)
ID_EXPEDIENTE = models.CharField(max_length=128, null=True, blank=True)
IND_DRC = models.CharField(max_length=128, null=True, blank=True)
SEGMENTO_DRC_S_CIRCULAR = models.CharField(max_length=128, null=True, blank=True)
TIPO_OPERACION_SUBTIPO_IRB = models.CharField(max_length=128, null=True, blank=True)
COD_INSOLVENCIA = models.CharField(max_length=128, null=True, blank=True)
CLASIFICACION = models.CharField(max_length=128, null=True, blank=True)
CONCEDIDO = models.CharField(max_length=128, null=True, blank=True)
DPTO_NORMAL = models.CharField(max_length=128, null=True, blank=True)
DPTO_VIG_ESPECIAL = models.CharField(max_length=128, null=True, blank=True)
DPTO_DUDOSO = models.CharField(max_length=128, null=True, blank=True)
DPTO_MUY_DUDOSO = models.CharField(max_length=128, null=True, blank=True)
DPTO_TOTAL = models.CharField(max_length=128, null=True, blank=True)
class Meta:
verbose_name = "Matriz Audited Client Period Data"
verbose_name_plural = "Matrices Audited Clients Period Data"
ordering = ["-ANIO"]
resources.py
from django.http import Http404
from rest_framework import views
from rest_framework.response import Response
from rest_framework import status
from ..serializers.s_audited_client import AuditedClientSerializer, AuditedClientPeriodSerializer, AuditedClientPeriodMatrizSerializer
from ...models import Audited_Client, Audited_Client_Period, Audited_Client_Period_Matriz
from django.contrib.auth.models import User
from rest_framework.permissions import IsAuthenticated
from rest_framework.authentication import TokenAuthentication
# -------------------------------- CLASS FOR NEW AUDITED CLIENTS -------------------------------
class AuditedClientListView(views.APIView):
permission_classes = (IsAuthenticated,)
authentication_classes = (TokenAuthentication,)
#permission_classes = ()
#authentication_classes = ()
def get(self, request, format='json'):
#user = request.user
#if str(request.auth) == str(user.auth_token.key):
auditedClient = Audited_Client.objects.all()
serializer = AuditedClientSerializer(auditedClient, many=True)
return Response(serializer.data)
def post(self, request, format=None):
userid = User.objects.get(id=request.user.id)
serializer = AuditedClientSerializer(data=request.data)
print(serializer)
if serializer.is_valid():
serializer.save(author_audited_client=userid)
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class AuditedClientDetailView(views.APIView):
permission_classes = (IsAuthenticated,)
authentication_classes = (TokenAuthentication,)
def get_object(self, pk_1):
try:
return Audited_Client.objects.get(pk=pk_1)
except AuditedClientSerializer.DoesNotExist:
raise Http404
def get(self, request, pk_1, format=None):
ObjectAuditClient = self.get_object(pk_1)
serializer = AuditedClientSerializer(ObjectAuditClient)
return Response(serializer.data)
def put(self, request, pk_1, format=None):
ObjectAuditClient = self.get_object(pk_1)
userid = User.objects.get(id=request.user.id)
serializer = AuditedClientSerializer(ObjectAuditClient, data=request.data)
if serializer.is_valid():
serializer.save(author_audited_client=userid)
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, pk_1, format=None):
ObjectAuditClient = self.get_object(pk_1)
ObjectAuditClient.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
# -------------------------------- CLASS FOR NEW AUDITED CLIENTS IN A PERIOD -------------------------------
class AuditedClientPeriodListView(views.APIView):
permission_classes = (IsAuthenticated,)
authentication_classes = (TokenAuthentication,)
def get(self, request, pk_1, format=None):
#user = request.user
#if str(request.auth) == str(user.auth_token.key):
#auditedClientPeriod = Audited_Client_Period.objects.filter(clientName=pk_1).filter(id=1)
auditedClientPeriod = Audited_Client_Period.objects.filter(clientName=pk_1)
serializer = AuditedClientPeriodSerializer(auditedClientPeriod, many=True)
return Response(serializer.data)
def post(self, request,pk_1, format=None):
userid = User.objects.get(id=request.user.id)
serializer = AuditedClientPeriodSerializer(data=request.data)
if serializer.is_valid():
serializer.save(author_audited_client_period=userid)
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class AuditedClientPeriodDetailView(views.APIView):
permission_classes = (IsAuthenticated,)
authentication_classes = (TokenAuthentication,)
def get(self, request, pk_1, pk_alt, format=None):
auditedClientPeriod = Audited_Client_Period.objects.filter(clientName=pk_1).filter(id=pk_alt)
serializer = AuditedClientPeriodSerializer(auditedClientPeriod, many=True)
return Response(serializer.data)
def put(self, request, pk_1, pk_alt, format=None):
ObjectAuditClientPeriod = Audited_Client_Period.objects.get(pk=pk_alt)
serializer = AuditedClientPeriodSerializer(ObjectAuditClientPeriod, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, pk_1, pk_alt, format=None):
ObjectAuditClientPeriod = Audited_Client_Period.objects.filter(clientName=pk_1).filter(id=pk_alt)
ObjectAuditClientPeriod.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
# -------------------------------- CLASS FOR MATRIX -------------------------------
class AuditedClientMatrixView(views.APIView):
# permission_classes = (IsAuthenticated,)
# authentication_classes = (TokenAuthentication,)
permission_classes = ()
authentication_classes = ()
def get(self, request, pk_1, pk_alt, format=None):
# user = request.user
# if str(request.auth) == str(user.auth_token.key):
auditedClient = Audited_Client_Period_Matriz.objects.filter(clientName=pk_1).filter(clientNamePeriod=pk_alt)
serializer = AuditedClientPeriodMatrizSerializer(auditedClient, many=True)
return Response(serializer.data)
Есть идеи, что происходит?
Я ответил себе:
Проблема была в моемserializer.py, потому что моя функция создания не была хороша. Будет похоже на функцию обновления.
def create(self, validated_data):
#print(validated_data)
# Del validated data me vienen un los datos principales del cliente y luego todos los objetos los demas models
# 1- Extraigo los valores para rellenar el model de AuditedClient que son el clientName y author_audited_client
username = validated_data.get('author_audited_client', None)
clientNameFront = validated_data.get('clientName', None)
# 2- Creo el AuditedClient para luego pasarselo al que hereda (ForeignKey)
AuditedClient = Audited_Client.objects.create(clientName=clientNameFront, author_audited_client=username)
# 3- Extraigo con pop el segundo modelo para luego recorrerlos y rellenarlos.
AuditedClientPeriods = validated_data.pop('AuditedClientPeriods')
for AuditedClientPeriod in AuditedClientPeriods:
# 4- Extraigo con pop el tercer modelo para luego recorrerlos y rellenarlos.
AuditedClientPeriodMatrices = AuditedClientPeriod.pop('AuditedClientPeriodMatrices')
# Como extraje con pop los otros modelos ahora los recorro y los relleno
auditedClientPeriodFront = AuditedClientPeriod.get('clientNamePeriod', None)
AuditedClientPeriod = Audited_Client_Period.objects.create(clientName=AuditedClient,
clientNamePeriod=auditedClientPeriodFront,
author_audited_client_period=username)
for AuditedClientPeriodMatriz in AuditedClientPeriodMatrices:
# 5- Extraigo con pop el cuarto modelo para luego recorrerlos y rellenarlos.
AuditedClientPeriodMatrizDatas = AuditedClientPeriodMatriz.pop('AuditedClientPeriodMatrizDatas')
auditedClientPeriodMatrizFront = AuditedClientPeriodMatriz.get('matriz', None)
AuditedClientPeriodMatriz = Audited_Client_Period_Matriz.objects.create(clientName=AuditedClient,
clientNamePeriod=AuditedClientPeriod,
matriz=auditedClientPeriodMatrizFront,
author_matriz_audited_client_period=username)
for AuditedClientPeriodMatrizDatas in AuditedClientPeriodMatrizDatas:
# Como del front vienen muchos datos si hago AuditedClientPeriodMatrizDatas** cojo todos los datos
AuditedClientPeriodMatrizData = Audited_Client_Period_Matriz_Data.objects.create(
**AuditedClientPeriodMatrizDatas, clientName=AuditedClient,
clientNamePeriod=AuditedClientPeriod, matriz=AuditedClientPeriodMatriz)
return AuditedClient