嵌套字段序列化程序 - 数据丢失 [英] Nested field serializer - Data missing

查看:105
本文介绍了嵌套字段序列化程序 - 数据丢失的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


与此主题相关







我不能遵循所附主题的答案,因为序列化后缺少 ID


  • 模型。 py

  • Model.py

class Owner(models.Model):
    name = models.CharField(db_index=True, max_length=200)

class Car(models.Model):
    name = models.CharField(db_index=True, max_length=200)
    LCVS  = models.ForeignKey(Owner)




  • View.py

    • View.py
    • class OwnerViewSet(viewsets.ModelViewSet):
          queryset = Owner.objects.all()
          serializer_class = OwnerSerializer
      
      class CarViewSet(viewsets.ModelViewSet):
          serializer_class = CarSerializer
          queryset = Car.objects.all()
      




      • Serializer.py

        • Serializer.py
        • / p>

          class OwnerSerializer(serializers.ModelSerializer):
              class Meta:
                  model =  Owner
                  fields = ('id', 'name')
          
          class CarSerializer(serializers.ModelSerializer):
              owner = OwnerSerializer() 
          
              class Meta:
                  model =  Car
                  fields = ('id', 'name', 'owner')
          
              def create(self, validated_data):
                  tmp_owner = Owner.objects.get(id=validated_data["car"]["id"])
                  car = Car.objects.create(name=self.data['name'],owner=tmp_owner)
                  return car
          






          现在我发送以下请求:


          Now i send the following request :

          Request URL:http://localhost:9000/api/v1/cars
          Request Method:POST
          Request Paylod :
          {
              "name": "Car_test", 
              "ower": {
                  "id":1,
                  "name": "Owner_test"
              }
          }
          

          但是,这里validated_data不包含所有者ID!

          But, here the validated_data don't contain the owner ID !

          追溯| local vars

          Traceback | Local vars

           validated_data {u'Owner': OrderedDict([(u'name', u'Owner_test')]), u'name': u'Car_test'} 
          






          @凯文布朗:

          工作!感谢
          我会验证你的答案,但我得到一个新的问题...


          @Kevin Brown :
          Workful ! Thanks I'll validate your answer but I get a new problem...

          现在,当我尝试放置一个新的所有者,一个错误提高: / p>

          Now when I try to put a new Owner, an error raise :

          {
              "id": [
                  "This field is required."
              ]
          }
          

          我不得不创建一个新的序列化程序?

          I had to create a new serializer ?

          推荐答案

          您的模型中的任何 AutoField (这是自动生成的<$当Django REST Framework在后台创建字段时,默认情况下,c $ c> id key is)设置为只读。您可以通过执行

          Any AutoFields on your model (which is what the automatically generated id key is) are set to read-only by default when Django REST Framework is creating fields in the background. You can confirm this by doing

          repr(CarSerializer())
          

          并看到使用 read_only = True生成的字段设置。您可以使用 > extra_kwargs Meta选项,它将允许您覆盖它并设置 read_only = False

          and seeing the field generated with read_only=True set. You can override this with the extra_kwargs Meta option which will allow you to override it and set read_only=False.

          class OwnerSerializer(serializers.ModelSerializer):
          
              class Meta:
                  model =  Owner
                  fields = ('id', 'name')
                  extra_kwargs = {
                      "id": {
                          "read_only": False,
                          "required": False,
                      },
                  }
          

          这将包括 id validated_data 中的字段。

          这篇关于嵌套字段序列化程序 - 数据丢失的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆