Django Rest Framework - 使用中间模型

时间:2017-07-12 06:53:53

标签: python django django-rest-framework

我有三个模型,其中一个是连接其他两个的中间模型。我可以通过外键关系正确地嵌套这两个模型,但是我想使用这个中间模型将它们链接在一起,因为在这种情况下不希望有直接的密钥关系。期望的输出在底部。

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

1 个答案:

答案 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')