【发布时间】:2020-05-05 16:22:36
【问题描述】:
我是 Django Rest Framework 的新手,想了解编写处理嵌套关系的序列化程序的公认做法是什么。
比如说,我有一个模型叫Client 和Invoice(这只是一个说明性的例子):
class Client(models.Model)
name = models.CharField(max_length=256)
class Invoice(models.Model)
client = models.ForeignKey(Client)
date = models.DateTimeField()
amount = models.DecimalField(max_digits=10, decimal_places=3)
我想为Client 创建一个支持以下用例的序列化程序:
- 创建一个
Client - 当我创建
Invoice时,请使用id引用Client。
假设我使用这个实现:
class ClientSerializer(serializers.ModelSerializer):
class Meta:
model = Client
fields = ['id', 'name']
class InvoiceSerializer(serializers.ModelSerializer):
client = ClientSerializer()
class Meta:
model = Invoice
fields = ['id', 'client', 'date', 'amount']
def create(self, data):
client = Client.objects.get(pk=data['client']['id'])
invoice = Invoice(client=client,
date=datetime.fromisoformat(data['date']),
amount=Decimal(data['amount']))
invoice.save()
使用此代码,如果我尝试创建 Invoice,我需要 POST 数据中的 client 对象也包含 name。没有name 字段(read_only=True、write_only=True、required=False)的配置允许我创建和读取Client,并且在创建Invoice 时不需要。
应该如何解决?
- 请求中是否包含
name字段是公认的做法? - 我们能否以某种方式创建这样的嵌套模型?
/api/Client/<id:client_id>/Invoice - 我们是否为每个模型创建多个
Serializer类 - 一个用于它自己的视图集,另一个用于其他模型的视图集?
谢谢!
【问题讨论】:
标签: django django-rest-framework django-serializer