2015-01-09 43 views
4

Related to this Topic嵌套场串行 - 数据丢失


嗨, 我不能跟随在附加题目的答案,因为ID被序列化后失踪。

  • 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

class OwnerViewSet(viewsets.ModelViewSet): 
    queryset = Owner.objects.all() 
    serializer_class = OwnerSerializer 

class CarViewSet(viewsets.ModelViewSet): 
    serializer_class = CarSerializer 
    queryset = Car.objects.all() 
  • Serializer.py

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 

现在我发送以下请求:

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!

Traceback |本地变量

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

@Kevin布朗:
Workful!由于 我会验证你的答案,但我得到了新的问题......

现在,当我试图把一个新的拥有者,一个错误加薪:

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

我不得不创建一个新的串行?

+0

我猜你的意思是'id = validated_data [“owner”] [“id”]',你的意思是'LCVS = tmp_owner'。也不需要获取所有者对象。只需创建:'car = Car.objects.create(name = validated_data ['name'],LCVS_id = validated_data [“owner”] [“id”])' – Christoffer

回答

13

当您的模型(这是自动生成的id键)的任何AutoField被默认设置为只读时Django REST框架在后台创建字段。您可以通过做

repr(CarSerializer()) 

并看到生成的字段与read_only=True设置。您可以覆盖此with the extra_kwargs Meta option,这将允许您覆盖它并设置read_only=False

class OwnerSerializer(serializers.ModelSerializer): 

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

这将包括在validated_dataid场当你需要它。

+0

谢谢,你能帮我多一点吗?我编辑主题 –

+0

还设置了'required = False'(更新了我的答案)。如果您有其他问题以避免使现有答案无效,我还建议在堆栈溢出中创建新问题。 :) –

+0

真的你rox,我不知道我怎么能找到的! –