【问题标题】:How to write Nested DRF Serializer with two foreign key fields如何使用两个外键字段编写嵌套 DRF 序列化程序
【发布时间】:2017-01-21 15:43:35
【问题描述】:

假设我有如下的 Django 模型:

class Car(models.Model):
    name = models.CharField()
    model = models.CharField()
    type = models.CharField()

class Scooter(models.Model):
    name = models.CharField()
    model = models.CharField()
    type = models.CharField()

class User(models.Model):
    name = models.CharField()
    car = models.ForeignKeyField()
    scooter = models.ForeignKeyField()

序列化器如下:

class CarSerializer(serializer.ModelSerializer):
    class Meta:
    model = Car
    fields = (
        'name',
        'model',
        'type'

    )

class ScooterSerializer(serializer.ModelSerializer):
    class Meta:
    model = Scooter
    fields = (
        'name',
        'model',
        'type'

    )


class UservehicleCreateSerializer(serializer.ModelSerializer):
    car = serializers.PrimaryKeyRelatedField(read_only=True)
    scooter = serializers.PrimaryKeyRelatedField(read_only=True)
    class Meta:
    model = User
    fields = (
    'name',
    'car',
    'scooter'
    )

所以场景是这样的: car 数据和scooter 数据已经创建,假设两者都有pk=1。我想分别使用序列化程序创建User 数据。 但在我的情况下很难找到相同的实际资源。汽车和踏板车的数据已经存在,我不需要再次创建它。

尝试过DRF Documentation for writing serialized nested 中的内容。

Api post request的数据如下:

{
    'name': "Nikhil",
    'car': 1,
    'scooter': 1
}

得到错误:

IntegrityError: (1048, "Column 'car_id' cannot be null")

在这件事上需要帮助。 谢谢!

【问题讨论】:

  • 但是你这里没有嵌套数据,所以嵌套序列化器是错误的方法。您的用户数据包含指向相关模型主键的链接,因此您应该使用PrimaryKeyRelatedField
  • 好的理解我的方法的这一方面(我的问题)。而当我把它们变成PrimaryKeyRelatedField 时无法创建数据
  • 那么你尝试了什么,你得到了什么错误?
  • @DanielRoseman 更新了问题
  • 你为什么将汽车和序列化器字段设置为read_only=True

标签: django serialization django-rest-framework


【解决方案1】:

尝试如下编写 UservehicleCreateSerializer:

class UservehicleCreateSerializer(serializer.ModelSerializer):
    car = CarSerializer(read_only=True)
    scooter = ScooterSerializer(read_only=True)
    class Meta:
        model = User
        fields = (
           'name',
           'car',
           'scooter'
        )

输出如下:

{
'name': "Nikhil",
'car': [
    'name': "Some name",
    'model': "Some model",
    'type': "Some type"
    ],
'scooter': [
    'name': "Some name",
    'model': "Some model",
    'type': "Some type"
    ]
}

我希望这是您所需要的。干杯! :)

【讨论】:

  • 不,先生,我不需要这个
猜你喜欢
  • 2019-02-19
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
相关资源
最近更新 更多