带孩子和父母关系的DRF使获取和发布有所不同

时间:2019-02-02 19:34:26

标签: django django-rest-framework

首次使用DRF并尝试了解如何使GET返回有关孩子的完整信息,包括完整的父母信息。我希望POST在创建孩子时应接受孩子信息以及父母ID或父母姓名。

感觉这里有一个简单的解决方案使我难以理解。

models.py

class TestParent(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=255)
    nickname = models.CharField(max_length=255, default='ballerz')

class TestChild(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=255)
    parent = models.ForeignKey(TestParent, related_name='test_children', null=True, blank=True, on_delete=models.CASCADE)

serializers.py

class TestParentSerializer(serializers.ModelSerializer):
    id = serializers.UUIDField()
    class Meta:
        model = TestParent
        fields = ('id', 'name',)

class TestChildSerializer(serializers.ModelSerializer):
    parent = TestParentSerializer(many=False, allow_null=False)

    class Meta:
        model = TestChild
        fields = ('id', 'name', 'parent')

views.py

class TestParentModelSet(viewsets.ModelViewSet):
    def __init__(self, **kwargs):
        self.name = "Parent API"
        self.description = ""

    queryset = TestParent.objects.all()    
    serializer_class = TestParentSerializer

class TestChildModelSet(viewsets.ModelViewSet):
    def __init__(self, **kwargs):
        self.name = "Child API"
        self.description = ""

    queryset = TestChild.objects.all()
    serializer_class = TestChildSerializer

    filter_fields = ('id', 'name')
    search_fields = filter_fields

GET返回我想要和期望的:

{
    "id": "515ff558-d0e2-4fdd-bdeb-9c5acf459687",
    "name": "Test Child 01",
    "parent": {
        "id": "1dc3d3ce-b45a-46b4-9b62-a227949a6d87",
        "name": "Foo Parent"
    }
}

1 个答案:

答案 0 :(得分:0)

不确定,如果DRF内有东西可以帮助您。我建议改写 retriev e方法

class TestChildModelSet(viewsets.ModelViewSet):
    def retrieve(self, request, *args, **kwargs):
        instance = self.get_object()
        parent = TestParent.object.get(id=instance.parent.id)
        return Response({"id":instance.id, "name":instance.name, "parent": {"id":parent.id, "name":parent.name}})

我还没有测试过该代码,但是希望它能工作