python - Django REST Framework nested serializer FK creation -
i'm in trouble creating bunch of related models using drf nested serializers. failing validation on foreign key.
models
class employee(models.model): user = models.onetoonefield(user) # django user ... class task(models.model): author = models.foreignkey(employee, related_name='tasks') title = models.charfield(max_length=64) ... class employeetarget(models.model): employee = models.foreignkey(employee, null=false) task = models.foreignkey(task, null=false, related_name='employee_targets') ...
objective
basically have employees
created, , want create task
, related employeetarget
in single request, getting request user author
. json request example:
{ "title": "lorem ipsum", "employee_targets": [ { "employee": 10 }, { "employee": 11 }] } /* or */ { "title": "lorem ipsum", "employee_targets": [10,11] }
serializers
class employeeserializer(serializers.modelserializer): name = serializers.charfield(source="user.get_full_name", read_only=true) email = serializers.charfield(source="user.email", read_only=true) class meta: model = employee class employeetargetserializer(serializers.modelserializer): employee = employeeserializer() class meta: model = employeetarget class taskserializer(base.modelserializer): employee_targets = employeetargetserializer(many=true, required=false) class meta: model = task def create(self, validated_data): employee_target_data = validated_data.pop('employee_targets') task = task.objects.create(**validated_data) employeetarget.objects.create(task=task, **employee_target_data) return task
viewset
class taskviewset(modelviewset): serializer_class = taskserializer def get_queryset(self): request_employee = self.request.user.employee return task.objects.filter(q(author=request_employee) | q(employee_targets__employee=request_employee)) def perform_create(self, serializer): serializer.save(author=self.request.user.employee)
result
i'm getting 400 bad request following error:
{ "employee_targets": [ { "employee": { "non_field_errors": ["invalid data. expected dictionary, got int."] }, "task": ["this field required."] } ], "author": ["this field required."] }
the employee
error expected, haven't figured out how create them using id.
the bigger problem here employee_targets
failing validation @ task
fk, before enclosing taskserializer
specify them @ create
method.
can try this:
class employeeserializer(serializers.modelserializer): name = serializers.charfield() email = serializers.charfield() class meta: depth = 2 model = employee
Comments
Post a Comment