AttributeError Django остальные рамки - PullRequest
0 голосов
/ 12 марта 2020

. Сохранение процесса в порядке, и данные отражаются в БД, но я получаю эту ошибку. «AttributeError: Получил AttributeError при попытке получить значение для поля asset_list на сериализаторе TransactionSerializer

Traceback

Traceback (most recent call last):
  File "C:\Users\a.wong\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
  File "C:\Users\a.wong\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
  File "C:\Users\a.wong\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\a.wong\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
  File "C:\Users\a.wong\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\views\generic\base.py", line 71, in view
return self.dispatch(request, *args, **kwargs)
  File "C:\Users\a.wong\AppData\Local\Programs\Python\Python38-32\lib\site-packages\rest_framework\views.py", line 505, in dispatch
response = self.handle_exception(exc)
  File "C:\Users\a.wong\AppData\Local\Programs\Python\Python38-32\lib\site-packages\rest_framework\views.py", line 465, in handle_exception
self.raise_uncaught_exception(exc)
  File "C:\Users\a.wong\AppData\Local\Programs\Python\Python38-32\lib\site-packages\rest_framework\views.py", line 476, in raise_uncaught_exception
raise exc
  File "C:\Users\a.wong\AppData\Local\Programs\Python\Python38-32\lib\site-packages\rest_framework\views.py", line 502, in dispatch
response = handler(request, *args, **kwargs)
  File "C:\Users\a.wong\assetWorkspace\Asset\AIMS-BE\V1\transactions\views\transactions_view.py", line 22, in post
return Response(TransactionSerializer(transaction).data, status=status.HTTP_201_CREATED)
  File "C:\Users\a.wong\AppData\Local\Programs\Python\Python38-32\lib\site-packages\rest_framework\serializers.py", line 562, in data
ret = super().data
  File "C:\Users\a.wong\AppData\Local\Programs\Python\Python38-32\lib\site-packages\rest_framework\serializers.py", line 260, in data
self._data = self.to_representation(self.instance)
  File "C:\Users\a.wong\AppData\Local\Programs\Python\Python38-32\lib\site-packages\rest_framework\serializers.py", line 516, in to_representation
attribute = field.get_attribute(instance)
  File "C:\Users\a.wong\AppData\Local\Programs\Python\Python38-32\lib\site-packages\rest_framework\fields.py", line 487, in get_attribute
raise type(exc)(msg)
AttributeError: Got AttributeError when attempting to get a value for field `asset_list` on serializer `TransactionSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `Transaction` instance.
Original exception text was: 'Transaction' object has no attribute 'asset_list'.

Models

транзакция_основы

from V1.accounts.models.employee_main import Employee

class Transaction(CreatedModified):

    transaction_id = models.BigAutoField(primary_key=True)
    employee_from = models.ForeignKey(
        Employee,
        related_name='employee_from_transactions', 
        related_query_name='employee_from_transaction',
        default=None,
        on_delete=models.CASCADE
    )
    employee_to = models.ForeignKey(
        Employee,
        related_name='employee_to_transactions', 
        related_query_name='employee_to_transaction',
        default=None,
        on_delete=models.CASCADE
    ) 
    location_from = models.CharField(null=True, blank=True, max_length=255)
    location_to = models.CharField(null=True, blank=True, max_length=255)
    transaction_type = models.CharField(
        max_length=3,
        choices=TransactionType.choices,
        default=None
    )
    date_issued = models.DateField(auto_now=False, auto_now_add=False)
    remarks = models.CharField(null=True, blank=True, max_length=255)

транзакция_домена_ассета

from V1.transactions.models.transaction_main import Transaction
from V1.assets.models.asset_main import Asset


class TransactionAssets(CreatedModified):

    transaction = models.ForeignKey(
        Transaction, 
        related_name='tr_assets_transactions', 
        related_query_name='tr_assets_transaction',
        default=None,
        on_delete=models.CASCADE
    )
    asset = models.ForeignKey(
        Asset,
        related_name='assets_transactions', 
        related_query_name='assets_transaction',
        default=None,
        on_delete=models.CASCADE
    )
    created_at  = models.DateTimeField(auto_now_add=True, editable=False)
    created_by  = models.ForeignKey(settings.AUTH_USER_MODEL,
                    null=True, db_index=True, editable=False,
                    on_delete=models.SET_NULL, related_name="tr_assets_created")

Сериализаторы

транзакции_ассет_сериализатора

from V1.transactions.models.transaction_main_assets import TransactionAssets

class Transaction_AssetsSerializer(serializers.ModelSerializer):

    class Meta:
        model = TransactionAssets
        fields = ('asset',)

транзакции_сериализатора

from V1.transactions.models.transaction_main import Transaction
from V1.transactions.models.transaction_main_assets import TransactionAssets
from V1.transactions.serializers.transactions_asset_serializer import Transaction_AssetsSerializer




class TransactionSerializer(serializers.ModelSerializer):
    asset_list = Transaction_AssetsSerializer(many=True)

    class Meta:
        model = Transaction
        fields = (
            'employee_from',
            'employee_to',
            'location_from',
            'location_to',
            'transaction_type',
            'date_issued',
            'remarks',
            'asset_list'
        )

    def create(self, validated_data):  
        asset_data = validated_data.pop('asset_list')

        transaction = Transaction.objects.create(
            employee_from = validated_data['employee_from'],
            employee_to = validated_data['employee_to'],
            location_from = validated_data['location_from'],
            location_to = validated_data['location_to'],
            transaction_type = validated_data['transaction_type'],
            date_issued = validated_data['date_issued'],
            remarks = validated_data['remarks'],
            created_by=self.context['request'].user
         )

        for Transaction_item in asset_data:
            TransactionAssets.objects.create(
                transaction=transaction, 
                created_by=self.context['request'].user,
                **Transaction_item
            )

        return transaction

Просмотр

class TransactionList(APIView):
@staticmethod
def get(request):
    transactions = Transaction.objects.all()
    return Response(TransactionSerializer(transactions, many=True).data)

@staticmethod
def post(request):

    serializer = TransactionSerializer(data=request.data, context={'request': request})
    if serializer.is_valid():  
        transaction = serializer.save() 
        return Response(TransactionSerializer(transaction).data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

1 Ответ

0 голосов
/ 23 марта 2020

Думаю, мне нужно пока что обойтись с результатом, так как он сохраняется в БД, я узнал, что он из-за моего ответа, и как-то связан с тем, как я настроил свои сериализаторы.

Итак я просто изменил свой ответ на.

@staticmethod
def post(request):

serializer = TransactionSerializer(data=request.data, context={'request': request})
    if serializer.is_valid():  
        transaction = serializer.save() 
        return Response(request.data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
...