Skip to main content
 首页 » 编程设计

python之Django api调用以保存用户模型的外键

2025年01月19日34三少

我正在做的是 django 2 项目调用 api 到 django 1 项目在 Appointment 表中预约并将详细信息保存到 BookAppt 表中。

根据给出的答案之一更新我的代码后,我现在收到此错误。 {"patientId":["This field is required."]} 我不知道为什么,尽管我已经把它包含进去了。

请帮忙,因为我已经在这部分停留了 2 天了。

请注意,它是 django 2 调用 django 1。这是我的代码:

- 模型.py

-- django 1

class Appointments (models.Model): 
    patientId = models.IntegerField() 
    clinicId = models.CharField(max_length=10) 
    date = models.DateField() 
    time = models.TimeField() 
    created = models.DateTimeField(auto_now_add=True) 
    ticketNo = models.IntegerField() 
 
    STATUS_CHOICES = ( 
        ("Booked", "Booked"), 
        ("Done", "Done"), 
        ("Cancelled", "Cancelled"), 
    ) 
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default="Booked") 

-- django 2

class MyUser(AbstractUser): 
    userId = models.AutoField(primary_key=True) 
    gender = models.CharField(max_length=6, blank=True, null=True) 
    nric = models.CharField(max_length=9, blank=True, null=True) 
    birthday = models.DateField(blank=True, null=True) 
    birthTime = models.TimeField(blank=True, null=True) 
 
class BookAppt(models.Model): 
    clinicId = models.CharField(max_length=20) 
    patientId = models.ForeignKey(MyUser, on_delete=models.CASCADE) 
    scheduleTime = models.DateTimeField() 
    ticketNo = models.CharField(max_length=5) 
    status = models.CharField(max_length=20) 

- 序列化器

-- django 1

class AppointmentsSerializer(serializers.ModelSerializer): 
 
    class Meta: 
        model = Appointments 
        fields = ('id', 'patientId', 'clinicId', 'date', 'time', 'created', 'ticketNo', 'status') 

-- django 2

class MyUserSerializer(serializers.ModelSerializer): 
 
    class Meta: 
        model = MyUser 
        fields = ('userId', 'username', 'email', 'first_name', 'last_name', 'gender', 'nric', 'birthday', 'birthTime') 
        read_only_fields = ('userId',) 
 
 
class BookApptSerializer(serializers.ModelSerializer): 
    patientId = MyUserSerializer(many=False) 
 
    class Meta: 
        model = BookAppt 
        fields = ('id', 'patientId', 'clinicId', 'scheduleTime', 'ticketNo', 'status') 

-view.py

-- django 1

class AppointmentsViewSet(viewsets.ModelViewSet): 
    permission_classes = [AllowAny] 
    queryset = Appointments.objects.all() 
    serializer_class = AppointmentsSerializer 

-- django 2

@csrf_exempt 
def my_django_view(request): 
 
    if request.method == 'POST': 
        r = requests.post('http://127.0.0.1:8000/api/makeapp/', data=request.POST) 
    else: 
        r = requests.get('http://127.0.0.1:8000/api/makeapp/', data=request.GET) 
 
    if r.status_code == 201 and request.method == 'POST': 
        data = r.json() 
        patient = request.data['patientId'] 
        patientId = MyUser.objects.get(id=patient) 
 
        saveget_attrs = { 
            "patientId": patientId, 
            "clinicId": data["clinicId"], 
            "scheduleTime": data["created"], 
            "ticketNo": data["ticketNo"], 
            "status": data["status"], 
        } 
        saving = BookAppt.objects.create(**saveget_attrs) 
 
        return HttpResponse(r.text) 
    elif r.status_code == 200:  # GET response 
        return HttpResponse(r.json()) 
    else: 
        return HttpResponse(r.text) 
 
 
class BookApptViewSet(viewsets.ModelViewSet): 
    permission_classes = [AllowAny] 
    queryset = BookAppt.objects.all() 
    serializer_class = BookApptSerializer 

-更新 1

序列化器

class BookApptSerializer(serializers.ModelSerializer): 
    patientId = MyUserSerializer(many=False) 
 
    class Meta: 
        model = BookAppt 
        fields = ('id', 'patientId', 'clinicId', 'scheduleTime', 'ticketNo', 'status') 

错误

“WSGIRequest”对象没有属性“data”

请您参考如下方法:

我猜你在 BookApptSerializer 中遇到了问题。从 patientId 字段中删除 MyUserSerializer 并使用默认值。它将接受 id 字符串或数字。如果要显示用户数据,可以重写to_representation方法或者使用MethodField。

class BookApptSerializer(serializers.ModelSerializer): 
 
    class Meta: 
        model = BookAppt 
        fields = ('id', 'patientId', 'clinicId', 'scheduleTime', 'ticketNo', 'status')