2016-04-06 110 views
0

我有一个DoctorUserProfile由Django用户模型扩展。 我还有另一个模型,DoctorPerHospital,它扩展了DoctorUserProfile来存储与特定医生有关的数据。值错误:“DoctorPerHospital.doc_id”必须是“DoctorUserProfile”实例

我已经使用DRF来创建API,并且我创建了一个将数据添加到DoctorPerHospital模型并将DoctorUserProfile链接到当前用户的API。 我对着错误说应该 models.py的实例

class DoctorUserProfile(models.Model): 
    user = models.ForeignKey(User, null=True, blank=True) 
    name = models.CharField(max_length=50) 
    age = models.CharField(max_length=10) 
    gender = models.CharField(max_length=10) 
    spec = models.CharField(max_length=50, choices=DOCTOR_TYPE, null=True, blank=True, db_index=True) 
    education = models.CharField(max_length=50, choices=DOCTOR_EDU, default=PHY, db_index=True) 
    profile_image = VersatileImageField('doctor_images', upload_to="doctor_images/", null=True, blank=True) 
    experience = models.CharField(max_length=100, null=True, blank=True) 
    speciality = models.ForeignKey(Specialities, on_delete=models.CASCADE, null=True, blank=True) 

class Meta: 
    app_label = 'pwave' 

def __str__(self): 
    return '%s' % (self.name) 



class DoctorPerHospital(models.Model): 
    doc_id = models.ForeignKey(DoctorUserProfile, null=True, blank=True) 
    hospital = models.ForeignKey(HospitalUserProfile, on_delete=models.CASCADE, null=True, blank=True) 
    appointment_cost = models.DecimalField(max_digits=8, decimal_places=2, default=0) 
    discount = models.DecimalField(max_digits=8, decimal_places=2, default=0) 
    discounted_cost = models.DecimalField(max_digits=8, decimal_places=2, default=0) 

class Meta: 
    app_label = 'pwave' 

def __str__(self): 
    return '%s' %(self.doc_id) 

Serializers.py

class DoctorInfoSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = DoctorUserProfile 
     fields = ('id','user','name','age','gender','spec','education', 
      'profile_image','experience','speciality') 
     read_only_fields = ('user',) 

class DoctorPerHospitalSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = DoctorPerHospital 
     fields = ('id','doc_id','hospital','appointment_cost','discount','discounted_cost') 
     read_only_fields = ('doc_id',) 

views.py

class DoctorPerHospitalViewSet(viewsets.ModelViewSet): 
    queryset = DoctorPerHospital.objects.all() 
    serializer_class = DoctorPerHospitalSerializer 

    def create(self, request): 
     serializer = self.serializer_class(data=request.data) 
     if serializer.is_valid(): 
      profile = serializer.save() 
      current_user = DoctorUserProfile.objects.get(user=request.user) 
      print(current_user.id) 
      profile.doc_id = current_user.id 
      profile.save() 
      return Response(serializer.validated_data) 
     return Response({ 
      'status': 'Bad request', 
      'message': 'Account could not be created with provided data' 
      }, status=status.HTTP_400_BAD_REQUEST) 

错误语句如下:

enter image description here

回答

0

当前模型和序列化程序有几个问题。

首先,doc_idDoctorPerHospital模型中出现错误。它应该是doc,因为Django ORM将使用模型实例。需要注意的是,如果它的命名doc,那么你将有一个额外的域,将代表存储在数据库中的关键,这将是doc_id - 即<foreign key field name>_id

接下来,你应该在DoctorUserProfile模型的用户ForeignKey更改为OneToOneField这将确保您的DoctorUserProfileUser

之间存在一对一的关系最后是关于序列化程序的创建。 docDoctorUserProfile实例,而request.userUser实例。您应该使用反转的DoctorUserProfile的用户从User实例获取配置文件。

+0

我解决了错误,我在我的vies.py中调用current_user.id instaed current_user。 谢谢你的建议,重要的是doc_id之一。 –

相关问题