首次使用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"
}
}
答案 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}})
我还没有测试过该代码,但是希望它能工作