我有三个模型,其中一个是连接其他两个的中间模型。我可以通过外键关系正确地嵌套这两个模型,但是我想使用这个中间模型将它们链接在一起,因为在这种情况下不希望有直接的密钥关系。期望的输出在底部。
models.py
class Parent(models.Model):
first_name = models.CharField(max_length=128)
last_name = models.CharField(max_length=128)
class Child(models.Model):
given_name = models.CharField(max_length=128)
# reverse relation works, but an intermediary model is preferred
# parent = models.ForeignKey(Parent, related_name="parents" on_delete=models.PROTECT)
class Link(models.Model):
parent = models.ForeignKey(Parent, on_delete=models.PROTECT)
child = models.ForeignKey(Child, on_delete=models.PROTECT)
serializers.py
class ChildSerializer(serializers.ModelSerializer):
class Meta:
model = Child
fields = '__all__'
class LinkSerializer(serializers.ModelSerializer):
# what should I place here?
class Meta:
model = Link
fields = '__all__'
class ParentSerializer(serializers.ModelSerializer):
children = LinkSerializer(many=True)
class Meta:
model = Parent
fields = ('id', 'first_name', 'last_name', 'children')
api_output.json
{
"id": 1,
"first_name": "John",
"last_name": "Appleseed",
"children": [
{
"id": 1,
"given_name": "Uno Appleseed"
},
{
"id": 2,
"given_name": "Dos Appleseed"
}
]
}
答案 0 :(得分:2)
尝试使用LinkSerializer中的source
关键字指定字段来源:
class LinkSerializer(serializers.ModelSerializer):
given_name = serializers.CharField(source='child.given_name')
id = given_name = serializers.CharField(source='child.id')
class Meta:
model = Link
fields = ('given_name', 'id')