Search code examples
djangoangularjsforeign-key-relationshipdjango-rest-framework

Disable creating nested objects in django rest framework


Hi,

Can you help me how to disable creating nested objects ?

I have serializers like this:
(Employee has ForeignKey to Team)

class TeamSerializer(serializers.ModelSerializer):
    class Meta:
        model = Team
        fields = ('id', 'name')
class EmployeeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Employee
        fields = ('id', 'name', 'surname', 'team')
        depth = 1

or instead could be:

class EmployeeSerializer(serializers.ModelSerializer):
    team = TeamSerializer()
    class Meta:
        model = Employee
        fields = ('id', 'name', 'surname', 'team')

when i post json (create employee)

{
    name: "name",
    surname: "surname",
    team: {
           id: 1,
           name: "Web Team"
          }
}

object employee creates but also object team... is there any way to disable creating team object together with employee ? i just want to create employee and set selected team (curently in database) to employee

And on GET (list) i would like to be able to retrieve data like:

{
 name: "name",
 surname: "surname",
 team: {
    id: 1,
    name: "Web Team"
 }

not like that

{
 name: "name",
 surname: "surname",
 team: 1
}

Is there any way to to that in django rest framework (also iam using angular)
Regards

UPDATE

Currently serializers:

class TeamSerializer(serializers.ModelSerializer):
    class Meta:
        model = Team

class EmployeeSerializer(serializers.ModelSerializer):
    team = TeamSerializer()

    class Meta:
        model = Employee

I cant use serializers.RelatedField() because it's returned only unicode I need 'id' and 'name' (i suppose)

this is my POST json: ( Restangular.all('employee').post(data) )

data: {
        name: "emp1",
        photo: "",
        skype: "",
        surname: "qweqwe",
        team: {
              id: 1,
              name: "Web",
        }
}

and DRF returned json:

employee: {
    id: 2,
    name: "emp1",
    photo: "",
    skype: "",
    surname: "qweqwe",
    team: {
        id:3, <-- NEW ID!
        name: "Web"
    }   
}

so yea, i am sure that new team objects created. So what now ?:)


Solution

  • Solved problem:

    class ReadEmployeeSerializer(serializers.ModelSerializer):
        team = TeamSerializer()
    
        class Meta:
            model = Employee
            fields = ('id', 'name', 'surname', 'team',)
    
    
    class WriteEmployeeSerializer(serializers.ModelSerializer):
    
        def from_native(self, data, files):
            data['team'] = data['team']['id']
            return serializers.ModelSerializer.from_native(self, data, files)
    
        def to_native(self, obj):
            return ReadEmployeeSerializer(obj).data
    
        class Meta:
            model = Employee
            fields = ('id', 'name', 'surname', 'team',)
    

    post/put method use primary key (WriteEmployeeSerializer) - before replace dict to primary key

    get method use full object (ReadEmployeeSerializer)