Django REST Framework: прямое назначение обратной стороне связанного набора запрещено. Вместо этого используйте AuditedClientPeriodMatrices.set () - PullRequest
0 голосов
/ 29 октября 2019

У меня следующая проблема, и я не знаю почему, потому что я отправляю:% 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...