【问题标题】:Nested field serializer - Data missing嵌套字段序列化器 - 数据丢失
【发布时间】:2015-03-07 15:12:26
【问题描述】:

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"
    }
}

但是,这里的验证数据不包含所有者 ID!

追溯 |本地变量

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

@凯文布朗:
有用!谢谢 我会验证你的答案,但我遇到了一个新问题......

现在,当我尝试设置新所有者时,会出现错误:

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

我必须创建一个新的序列化程序?

【问题讨论】:

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

标签: python django django-rest-framework


【解决方案1】:

当 Django REST Framework 在后台创建字段时,模型上的任何 AutoFields(这是自动生成的 id 键)默认设置为只读。您可以通过这样做来确认这一点

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,
            },
        }

这将在您需要时将id 字段包含在validated_data 中。

【讨论】:

  • 谢谢,你能帮我多一点吗?我编辑主题
  • 同时设置required=False(更新了我的答案)。如果您有其他问题以避免使现有答案无效,我还建议您在 Stack Overflow 上创建新问题。 :)
  • 真的是你,我不知道我怎么能找到那个!
  • 有同样的问题。应用相同的逻辑,但 serializer.is_valid() 为假。在创建约会模型对象时,我对患者 ID 和医生 ID 有外键约束。 & 它在 serializer.data 中的两个外键 id 上都给出了 null。这个 id 是在我实现上述解决方案后显示的,但我猜它不接受病人对象和医生对象,只接受 int(id)。因此 serializer.is_valid() 给出了 false 并且没有创建约会对象。我可以在约会表中创建对象的任何其他方式,其中 patient_id 和 doctor_id 作为各自模型的 foreign_key 实例?
猜你喜欢
  • 2017-12-07
  • 1970-01-01
  • 2016-02-29
  • 2016-10-04
  • 2023-04-05
  • 2020-09-29
  • 1970-01-01
  • 2016-02-13
  • 2020-05-25
相关资源
最近更新 更多