![](/img/trans.png)
[英]Django Rest Framework writable nested serializer with multiple nested objects
[英]Writable nested serializer in django-rest-framework?
我的设计如下关于 Django ModelSerializer。 有模型A和模型B。模型B有模型A的外键字段。由于某些原因,我不能直接使用主键序列化模型B。按照我的想法,我需要的是序列化另外两个字段(在模型 A 中独一无二)。
我看到 SlugRelatedField 必须用于一个 slug 字段。 我搜索了有一个 NaturalKeyField 可以支持 NaturalKeyField。 但看起来它被 django-rest-framework 取代。 但是我检查了 django-rest-framework,根本没有这样的字段。 有人可以帮忙吗?? 我该怎么办?
代码如下。 A型
class AssetModel(models.Model):
org = models.ForeignKey(Org, related_name='models')
name = models.CharField(max_length=128)
model_type = models.SmallIntegerField(default = 3,choices = MODEL_TYPE )
directory = models.CharField(max_length = 128)
...
class Meta:
unique_together = ('org', 'name',)
B型
class Dataitem(models.Model):
mod = models.ForeignKey(AssetModel, related_name='dataitems')
name = models.CharField(max_length=128)
data_type = models.SmallIntegerField(default =0,choices = DATAITEM_DATATYPE)
...
A型序列化器
class AssetModelSerializer(serializers.ModelSerializer):
org = serializers.SlugRelatedField(queryset=Org.objects.all(), slug_field='name')
class Meta:
model = AssetModel
fields = ('org', 'name', 'model_type',..
B 型序列化器
class DataitemSerializer(serializers.ModelSerializer):
class Meta:
model = Dataitem
fields = ('mod', 'name','data_type'...)
模型 A 的主键只是 Django 自动添加的 id。 在序列化模型B时,我需要获取模型A的组织和名称,读取和写入都需要。
你可以做这样的事情,为Dataitem
定义一个序列化器,它可以重用AssetModel
模型的序列化器
class AssetModelSerializer(serializers.ModelSerializer):
class Meta:
model = AssetModel
# Fields org and name of AssetModel will be inlcuded by default
class DataitemSerializer(serializers.ModelSerializer):
class Meta:
model = Dataitem
mod = AssetModelSerializer()
# This is the Dataitem.mod field
# which is a FK to AssetModel,
# Now it'll be serilized using the AssetModelSerializer
# and include the org and name fields of AssetModelSerializer
我更喜欢这种方法,因为我得到了控制。 如果你使用上面的序列化你会得到这样的结构:
data_item = {'name': ..., 'mod': {'org': ..., 'name': ...}}
^
|___ AssetModel fields
depth = n
您还可以在Dataitem
使用depth = 1
class DataitemSerializer(serializers.ModelSerializer):
class Meta:
model = Dataitem
depth = 1 # Will include fields from related models
# e.g. the mod FK to AssetModel
由于嵌套创建和更新的行为可能不明确,并且可能需要相关模型之间的复杂依赖关系,因此 REST framework 3 要求您始终明确地编写这些方法。
根据DRF 的文档,我们必须实现create/update
以使其可写
class DataitemSerializer(serializers.ModelSerializer):
class Meta:
model = Dataitem
# Nested serializer
mod = AssetModelSerializer()
# Custom create()
def create(self, validated_data):
# First we create 'mod' data for the AssetModel
mod_data = validated_data.pop('mod')
asset_model = AssetModel.objects.create(**mod_data)
# Now we create the Dataitem and set the Dataitem.mod FK
dataitem = Dataitem.objects.create(mod=asset_model, **validated_data)
# Return a Dataitem instance
return dataitem
似乎有一个库可以执行此drf-writable-nested
它处理这些类型的创建和序列化
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.