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

Popular posts from this blog

dns - How To Use Custom Nameserver On Free Cloudflare? -

python - Pygame screen.blit not working -

c# - Web API response xml language -