简体   繁体   English

Django Rest Framework我不能使用具有外键的序列化器保存模型

[英]Django Rest Framework I can't use Serializer save model of have foreign key

I'm a Django Rest Framework and Django newbie i can use random data to make stages but i can't use serializer to add new stages. 我是Django Rest Framework和Django新手,我可以使用随机数据创建阶段,但不能使用序列化器添加新阶段。

My model and serializer 我的模型和序列化器

class Stage(models.Model):
    class Meta:
        db_table = 'stage'
    stage_id = models.AutoField(primary_key=True)
    stage_name = models.CharField(max_length=64, null=False)
    company = models.ForeignKey(
        Company,
        db_column='id',
        on_delete=models.CASCADE,
    )
class StageSerializer(ModelSerializer):
    stage_id = IntegerField(read_only=True)
    class Meta:
        model = Stage
        fields = [
            'stage_id',
            'stage_name',
            'company',
        ]
    def update(self, instance, validated_data):
        pass
    def create(self, validated_data):
        # create stages
        stage = create_stage(**validated_data)
        return stage

view.py view.py

class StageListAPIView(APIView):
    def post(self, request, company_id):
        data = request.data.copy()
        company = get_company_by_id(company_id)
        data['company'] = company.pk
        serializer = StageSerializer(data=data)
        if not serializer.is_valid(raise_exception=True):
            return Response(serializer.errors, status=HTTP_400_BAD_REQUEST)
        new_data = serializer.validated_data
        serializer.save(company=company)
        return Response(new_data, status=HTTP_200_OK)

request.data request.data

<QueryDict: {'stage_name': ['kAkSdKq9Gt'], 'company': [6]}>

i will receive error: TypeError: Object of type Company is not JSON serializable 我将收到错误: TypeError: Object of type Company is not JSON serializable

i can't understand it and i don't know how to use serializer to save foreign key. 我听不懂,也不知道如何使用序列化程序保存外键。

You need to serialize the Company instance before you can include it in your StageSerializer . 您需要先序列化Company实例,然后才能将其包含在StageSerializer

A simple example would be something like 一个简单的例子就是

class CompanySerializer(ModelSerializer):

class Meta:
    model = Company
    fields = '__all__'

And then to include that in your StageSerializer : 然后将其包含在StageSerializer

class StageSerializer(ModelSerializer):
    stage_id = IntegerField(read_only=True)
    company = CompanySerializer(source='company', read_only=True)
    class Meta:
        model = Stage
        fields = [
            'stage_id',
            'stage_name',
            'company',
        ]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM