Django ViewSet perform_create не распознает мои данные

У меня есть проект на Django (python). Проблема заключается в том, что при попытке использовать функцию create для моего набора представлений она не распознает данные, передаваемые в него. (Она утверждает, что не выполняется ограничение NullConstraint.)

Мой views.py включает (обратите внимание на операторы print()):

class MyModelInstModelViewSet(ABC, MyModelrModelViewSet):
   dfn_class = None

   def _create(self, request, *args, **kwargs):
      print(request.data)
      # Check if 'dfn_id' is provided in request.data
      dfn_id = request.data.get('dfn_id')
      if dfn_id is None:
         return Response({'error': 'dfn_id is required'}, status=status.HTTP_400_BAD_REQUEST)

      # Retrieve the Def instance
      try:
         dfn = self.dfn_class.objects.get(id=dfn_id)
      except self.dfn_class.DoesNotExist:
         return Response({'error': 'Invalid dfn_id'}, status=status.HTTP_400_BAD_REQUEST)

      # Get default values from Def instance
      data = {}

      # Dynamically copy each/all fields from the Def instance
      for field in dfn._meta.fields:
         data[field.name] = getattr(dfn, field.name)

      # Update default values with request data
      for key, value in request.data.items():
         # If the value is a dict/JSONField, perform a deep copy
         if isinstance(value, dict):
            data[key] = copy.deepcopy(value)
         else:
            data[key] = value

      del data['id']
      del data['updated_at']

      data['created_at'] = timezone.now()

      if data['dfn_id'] is None:
         raise 'DFN ID IS NONE!'
      print(data)

      # Create a serializer instance with the updated data
      serializer = self.serializer_class(data=data)
      print('about to validate')
      serializer.is_valid(raise_exception=True)
      print('after validate')

      # Perform creation
      self.perform_create(serializer)
      print('after perform_create')

      return serializer

  def create(self, request, *args, **kwargs):
     res = self._create(request, *args, **kwargs)

     if isinstance(res, Response):
        return res

     return Response(res.data, status=status.HTTP_201_CREATED)

class MyModelModelViewSet(MyModelInstViewSet):
   ...

Мой models.py включает (обратите внимание, что класс модели mymodel определяет dfn как null=False):

Мой urls.py:

    # urls.py

    from django.urls import path, include
    from . import views
    from rest_framework import routers

    router = routers.DefaultRouter()

    router.register(prefix=r'mymodels',    viewset=views.MyModelViewSet,    basename='mymodel')

    urlpatterns = [
        path('api/', include(router.urls)),
        path('', views.home_view, name='home'),
    ]

Когда я отправляю POST /api/mymodel/ с полезной нагрузкой:

{
  "dfn_id": 11,
  "barcode": "Test DFNID POST CREATE!",
  "address": "This is a test"
}

Мой runserver выдает такую ошибку:

Вопросы печати печатаются и ясно показывают, что в словаре данных, передаваемом в конструктор сериализатора, присутствует ключ 'dfn_id' (в данном случае он имеет значение 11). Так как же получается, что 'dfn_id' - это None?

Заранее благодарю за любое понимание.

Я не эксперт, но, возможно, предоставление dfn вместо dfn_id сделает свою работу. Если вы предоставите свой сериализатор, это поможет больше.

Оказалось, что мне нужно улучшить класс сериализатора:

class AbstractSerializer(serializers.ModelSerializer):
    def update(self, instance, validated_data):
        for key in validated_data:
            if key == 'updated_at':
                continue
            else:
                instance.__dict__[key] = validated_data.get(key, instance.__dict__[key])
        instance.updated_at = timezone.now()
        instance.save()
        return instance

class AbstractDefSerializer(AbstractSerializer):
    pass

class AbstractInstSerializer(AbstractSerializer):
    pass

class mymodelSerializer(AbstractInstSerializer):
    dfn_id = serializers.PrimaryKeyRelatedField(queryset=mymodelDef.objects.all())

    def create(self, validated_data):
        dfn_id = validated_data.pop('dfn_id').id
        dfn = mymodelDef.objects.get(id=dfn_id)
        mymodel= mymodel.objects.create(dfn=dfn, **validated_data)
        return mymodel

    class Meta:
        model = mymodel
        fields = '__all__'
        depth = 1
Вернуться на верх