DRF с отношениями между ребенком и родителями делает Get & Post другим - PullRequest
0 голосов
/ 02 февраля 2019

Использование DRF в первый раз и попытка понять, как заставить GET возвращать полную информацию о ребенке, включая полную информацию о родителе.Я хочу, чтобы POST принимал информацию о ребенке и либо идентификатор родителя, либо имя родителя при создании ребенка.

Такое ощущение, что здесь есть простое решение, которое ускользает от меня.

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 голосов
/ 04 февраля 2019

Не уверен, что если внутри 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}})

Я не тестировал этот код, но надеюсь, что он работает

...