在Django中使用外键保存实例

时间:2018-05-19 12:07:52

标签: django python-3.x django-rest-framework

class B(models.model):
    # some fields


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

串行:

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


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

任务:

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

但是serailizer.is_valid()给出错误,它预期字典但得到该对象。 如果我这样做 -

data['b'] = b.__dict__

我收到一条错误,表明此ID已经存在。 B是一个modelSerializer,从一个函数调用serializer.is_valid(),该函数是芹菜中的一个任务

1 个答案:

答案 0 :(得分:2)

不是将b对象提供给序列化程序的数据,而是将其传递给save方法,如下所示:

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

请注意,您需要制作序列化程序b字段read_only

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

您可以找到文档here的相关部分。