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