Arjunsingh
Arjunsingh

Reputation: 773

Saving Instance with Foreign Key in Django

class B(models.model):
    # some fields


class A(models.Model):
    b = models.ForeignKey(B)

Serializer:

class B_Serializer(serializers.ModelSerializer):
    class Meta:
        model = B
        fields = '__all__'


class A_Serializer(serializers.ModelSerializer):
    b = BSerializer()
    class Meta:
        model = A
        fields = '__all__'

Task:

def task():
    data = {}
    b = B.objects.get(id=1)
    data['b'] = b
    serializer = A_Serializer(data=data)
    if serializer.is_valid():
        serializer.save()         

But the serailizer.is_valid() gives error that it expected a dictionary but got that object. Now if I do this -

data['b'] = b.__dict__

I get an error that B with this id is already present. B is a modelSerializer and calling serializer.is_valid() from a function which is a task in celery

Upvotes: 1

Views: 265

Answers (1)

neverwalkaloner
neverwalkaloner

Reputation: 47374

Instead of providing b object to the serializer's data you can pass it to the save method, like this:

def task():
    data = {}
    b = B.objects.get(id=1)
    serializer = A_Serializer(data=data)
    if serializer.is_valid():
        serializer.save(b=b)

Note you need to make serializer's b field read_only:

class A_Serializer(serializers.ModelSerializer):
    b = BSerializer(read_only=True)
    class Meta:
        model = A
        fields = '__all__'

You can find related part of the doc here.

Upvotes: 2

Related Questions