Django RestFramwork, как получить компоненты дочерних компонентов после их фильтрации - PullRequest
0 голосов
/ 05 августа 2020

Я использую django restframe в качестве бэкэнда для моего приложения React. когда я создал рекурсивные данные, я отфильтровал представления, чтобы не отображать дочерние компоненты вне родительских компонентов queryset = Data.objects.filter(main__isnull=True). Моя проблема в том, что когда я go перехожу к api_link/1/, он будет GET компонентом, если он является родительским, но когда я говорю api_link/2/, я получаю "detail": "Not found.", потому что я их отфильтровал, но я все еще могу видеть их внутри ребенок, который я назвал sub, как показано ниже "

HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

[
    {
        "id": 1,
        "tag": "div",
        "text": "Hello",
        "src": "",
        "style": "",
        "main": null,
        "sub": [
            {
                "id": 2,
                "tag": "h1",
                "text": "test2",
                "src": null,
                "style": "",
                "main": 1,
                "sub": []
            },
            {
                "id": 3,
                "tag": "h1",
                "text": "test 3",
                "src": null,
                "style": "",
                "main": 1,
                "sub": []
            }
        ]
    },
    {
        "id": 4,
        "tag": "div",
        "text": "bla bla",
        "src": "",
        "style": "",
        "main": null,
        "sub": []
    }
]

api folder views.py

from data.models import Data
from .serializers import DataSerializer
from rest_framework import viewsets


class DataVeiwSet(viewsets.ModelViewSet):
    serializer_class = DataSerializer
    queryset = Data.objects.all()

urls.py

from .views import DataVeiwSet
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register('', DataVeiwSet, basename='user')
urlpatterns = router.urls

searializer.py

from rest_framework import serializers
from data.models import Data
from rest_framework_recursive.fields import RecursiveField
class DataSerializer(serializers.ModelSerializer):
      sub = RecursiveField(many=True, required=False)
      class Meta:
            model = Data
            fields = ('id','tag','text','src','style','main','sub')

myapp folder получено из python manage.py startapp myapp models.py

from django.db import models
from rest_framework.request import Request


class Data(models.Model):
    tag = models.CharField(blank=True, null=True, max_length=20)
    text = models.TextField(blank=True, null=True)
    src = models.URLField(blank=True, null=True)
    style = models.TextField(blank=True, null=True)

    main = models.ForeignKey(
        'self', null=True, blank=True, related_name="sub", on_delete=models.PROTECT)

1 Ответ

0 голосов
/ 05 августа 2020

Вы можете перезаписать методы поиска списка и указать c поиск. Я думаю, вы ищете что-то вроде этого:

class DataViewSet(viewsets.ModelViewSet):
    def list(self, request):
        queryset = Data.objects.filter(main__isnull=True)
        serializer = DataSerializer(queryset, many=True)
        return Response(serializer.data)
    
    # (You probably don't need to overwrite this)
    def retrieve(self, request, pk=None):
        queryset = Data.objects.all()
        data = get_object_or_404(queryset, pk=pk)
        serializer = DataSerializer(data)
        return Response(serializer.data)

Подробнее об этом можно прочитать здесь: https://www.django-rest-framework.org/api-guide/viewsets/#modelviewset https://www.django-rest-framework.org/api-guide/viewsets/#example

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...