【问题标题】:python djaango-rest-framework 3.3.3 update nested serializerpython django-rest-framework 3.3.3 更新嵌套序列化程序
【发布时间】:2017-01-28 20:56:50
【问题描述】:

使用 django-rest 框架 3.3.3

我正在尝试使用 django-rest 框架更新我的数据库中的现有数据,遵循之前发布的解决方案:django-rest-framework 3.0 create or update in nested serializer

总的来说,我对 django 和其他框架还很陌生。

鉴于以下模型:

class Clinic(models.Model):

    name = models.TextField()
    streetNumber = models.IntegerField()
    unitNumber = models.CharField(max_length=10, blank=True, null=True)
    streetName = models.CharField(max_length=50)
    city = models.CharField(max_length=50)
    province = models.CharField(max_length=3)
    country = models.CharField(max_length=30)
    postalCode = models.CharField(max_length=6)
    phone = models.CharField(max_length=10)

    def __str__(self):
        return self.name


class Time (models.Model):

     clinic = models.ForeignKey(Clinic, related_name='times')
     appointmentTime = models.CharField(max_length=100)

     def __str__(self):
         return self.appointmentTime

以及以下序列化程序:

class TimeSerializer(serializers.ModelSerializer):

    class Meta:
        model = Time
        fields = ('appointmentTime',)


class ClinicSerializer(serializers.ModelSerializer):

    times = TimeSerializer(many=True)

    class Meta:
        model = Clinic
        fields = '__all__'

    def update(self, instance, validated_data):

        instance.name = validated_data['name']
        instance.streetName = validated_data['streetName']
        instance.unitNumber = validated_data['unitNumber']
        instance.city = validated_data['city']
        instance.province = validated_data['province']
        instance.country = validated_data['country']
        instance.postalCode = validated_data['postalCode']
        instance.phone = validated_data['phone']
        #print(instance)
        instance.save()

        times_data = [item['id'] for item in validated_data['times']]
        print(times_data)
        for time in instance.clinics:
            if time.id not in times_data:
                time.delete()

        for item in validated_data['times']:
            time = Time(id=item['id'], clinic=instance,
            appointmentTime=item['appointmentTime'])
            time.save()

        return instance

还有以下观点:

class ClinicList(APIView):

def get(self,request):
    clinics = Clinic.objects.all()
    serializer = ClinicSerializer(clinics, many=True)
    return Response({'results': serializer.data})

def post(self, request):

    serializer = ClinicSerializer(data=request.data)
    if serializer.is_valid():

        serializer.update(Clinic, serializer.data)

        return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

以及以下现有数据:

{
        "id": 2,
        "times": [
            {
                "appointmentTime": "time3"
            },
            {
                "appointmentTime": "time3"
            }
        ],
        "name": "Example Clinic",
        "streetNumber": 123,
        "unitNumber": "",
        "streetName": "Example Street",
        "city": "Exampletown",
        "province": "Ont",
        "country": "Canada",
        "postalCode": "A1A1A1",
        "phone": "9059059059"
    }

我的 JSON POST 数据是:

{
        "id": 2,
        "times": [
            {
                "appointmentTime": "AAAA"
            },
            {
                "appointmentTime": "time3"
            }
        ],
        "name": "Example Clinic",
        "streetNumber": 123,
        "unitNumber": "",
        "streetName": "Example Street",
        "city": "Exampletown",
        "province": "Ont",
        "country": "Canada",
        "postalCode": "A1A1A1",
        "phone": "9059059059"
    }

我的问题是我收到一条错误消息:

文件“C:\Users\colin\Documents\GitHub\Walk_inExpressAPI\clinics\serializer.py”,

第 31 行,更新中

instance.save()

TypeError: save() 缺少 1 个必需的位置参数:'self'

我不确定我在这里做错了什么,或者为 instance.save() 提供什么值来纠正这个错误。我已经检查过该实例是 Clinic 类型的对象。

我想要完成的是每个诊所可以有多个预约时间。他们不会共享约会时间对象,因为我希望能够在每次预订新约会时删除一个约会时间,并且每个诊所都需要自己的一组可用约会时间。

希望你们能帮助我朝着正确的方向前进!谢谢!

【问题讨论】:

    标签: python django django-rest-framework django-serializer


    【解决方案1】:

    您应该在您的APIView 中使用PUT 方法:

    def put(self, request, pk):
       clinics = Clinic.objects.get(pk=pk)
       serializer = ClinicSerializer(clinics, data=request.data)
       if serializer.is_valid():
           serializer.save()
           return Response(serializer.data)
       return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    

    所以在你的 url.py 中应该有一个 pk,用来标识你要修改的对象:

    urlpatterns = [
        url(r'^snippets/$', views.ClinicList.as_view()),
        url(r'^snippets/(?P<pk>[0-9]+)/$', views.ClinicList.as_view()),
    ]
    

    在更新方法中更改实例属性,如:

    instance.name = validated_data.get('name',instance.name)
    

    也尝试查看DRF page 中的示例。

    【讨论】:

      猜你喜欢
      • 2016-02-09
      • 1970-01-01
      • 2018-10-26
      • 1970-01-01
      • 1970-01-01
      • 2017-12-03
      • 2019-08-10
      • 2023-03-26
      • 2018-07-06
      相关资源
      最近更新 更多