【问题标题】:Django api call in view to save foreign key of user modelDjango api调用视图保存用户模型的外键
【发布时间】:2018-01-30 03:51:29
【问题描述】:

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

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

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

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

-model.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' object has no attribute 'data'

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

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

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

    【讨论】:

    • 我之前确实尝试过,但我最终得到了另一个错误。这个:'WSGIRequest' object has no attribute 'data'。这可能是这行 django 2 视图 patient = request.data['patientId'] 中的原因。但我仍然不明白是什么问题。
    • @JinNiiSama 您使用哪个版本的 DRF?也许它是具有DATAFILES 属性而不是单个data 的旧版本,或者您可能根本忘记安装DRF :)。无论如何,您可以通过dir(request) 检查可用的方法。 request.POST 显示什么?
    • 我当前的版本是1.11.3,我没有更新的原因是如果我更新了,我的代码需要更改,因为如果我没有错,在url.py中,它的使用路径而不是网址。我不确定更新是否会搞砸我的整个项目。
    • 我在data=r.json() 之后插入print(data)。这是邮政价值。 [31/Jan/2018 10:21:42] "POST /api/makeapp/ HTTP/1.1" 201 139 {'id': 22, 'patientId': 4, 'clinicId': '1', 'date': '2018-07-10', 'time': '08:00 AM', 'created': '2018-01-31 01:21:42', 'ticketNo': 1, 'status': 'Booked'}
    • @JinNiiSama 好的,然后使用此数据而不是 request.data['patientId'] 你已经拥有所有数据在行 data=r.json(),旧版本的 DRF 没有 .data 属性
    猜你喜欢
    • 2018-07-07
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 2015-10-11
    • 2013-06-26
    相关资源
    最近更新 更多