DRF 序列化器关联多表后提交数据

DRF 序列化器关联多表后提交数据

models.py

class Doctor(models.Model):
    dname = models.CharField(max_length=18)
    service = models.CharField(max_length=10)


class Patient(models.Model):
    pname = models.CharField(max_length=18)
    pidentity = models.IntegerField(unique=True)
    ptel = models.IntegerField(null=True, blank=True)
    dname = models.ForeignKey(Doctor, verbose_name='主治医生', on_delete=models.DO_NOTHING, db_constraint=False)

serializers.py

class DoctorSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Doctor
        fields = '__all__'


class PatientSerializer(serializers.HyperlinkedModelSerializer):
    dname = DoctorSerializer()

    def create(self, validated_data):
        '''

        :param validated_data: post请求传入的数据 {'pname': 'Anne', 'ptel': 135786897, 'pidentity': 1004, 'dname': OrderedDict([('dname', '李内'), ('service', '内科')])}

        :return:
        '''
        print(validated_data)
        # print(self.initial_data)
        dname = validated_data.pop('dname') # 取出关联外键对应表的数据
        try:
            dname = Doctor.objects.get(dname=dname["dname"], service=dname["service"]) # 通过外键关联数据,从外键对应表中获取外键对应表中的实例
        except Doctor.DoesNotExist as e:
            print('医生不存在', e)
        return Patient.objects.create(dname=dname, **validated_data) # 将获取到的外键对应表的实例,赋值给'dname'(外键要求传入值必须为对应表的实例)

    class Meta:
        model = Patient

        fields = ['pname', 'ptel', 'pidentity', 'dname']

views.py

class DoctorViewset(viewsets.ModelViewSet):
    queryset = Doctor.objects.all()
    serializer_class = DoctorSerializer


class PatientViewset(viewsets.ModelViewSet):
    queryset = Patient.objects.all()
    serializer_class = PatientSerializer

urls.py

router = DefaultRouter()

router.register('doctor', DoctorViewset)
router.register('patient', PatientViewset)

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include(router.urls)),
]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值