django-rest를 사용하여 django에서 중첩 된 관계형 모델을 직렬화하는 방법은 무엇입니까?

베냐민 자파리

서로 다른 관계를 가진 장고 모델이 있습니다 (예 : 다 대다, Foreignkey). 이제 djnago-rest.

다음은 내 모델과 그 관계의 예입니다.

class CommonFieldsAbstarct(models.Model):
    name = models.CharField(max_length=30, unique=True)

class ServerModel(CommonFieldsAbstarct):
    server_ip = models.GenericIPAddressField(default='172.17.0.1')
    server_port = models.IntegerField(default='9001')

class SNMPLineModel(CommonFieldsAbstarct):
    ip_address = models.GenericIPAddressField()
    port = models.IntegerField(default=161)

class SNMPModel(CommonFieldsAbstarct):  # target
    line = models.ForeignKey(SNMPLineModel, on_delete=CASCADE)
    servers = models.ManyToManyField(ServerModel)

class MetaDataModel(models.Model):
    key = models.CharField(max_length=20)
    value = models.CharField(max_length=20)
    snmp_device = models.ForeignKey(SNMPModel, on_delete=CASCADE)

이전에는이 ​​방법을 사용하여 수동으로 json을 만들었습니다.

def meta_data_json(meta_data):
    meta_data_list = []
    for meta in meta_data:
        meta_data_list.append({
            meta.key: meta.value
        })
    return meta_data_list

def server_json(servers):
    return [{'ip': server.server_ip,
             'port': server.server_port}
            for server in servers]

def create_json():
    snmp = SNMPModel.objects.filter(name__contains='a-name')
    return {
        'name': snmp.name,
        'address': snmp.line.ip_address,
        'port': snmp.line.port,
        'servers': server_json(snmp.servers.all()),
        'meta_data': meta_data_json(MetaDataModel.objects.filter(
                snmp_device=snmp.pk
            )
        ),
        'device_pk': snmp.pk
    }

내 질문:

이제 django-rest-framework대신 위의 json을 어떻게 만들 수 있습니까?

다 대다 문제는 없습니다. 사실, 내 문제는 그들의 foreignkey(들)에 있습니다.

그리고 지금까지 내가 한 일은 다음과 같습니다.

serializers.py

from rest_framework import serializers

class MetaDataSerializer(serializers.ModelSerializer):
    class Meta:
        fields = [
            'id',
            'key',
            'value',
            ]
        model = MetaDataModel

class ServerSerializer(serializers.ModelSerializer):
    class Meta:
        fields = [
            'id',
            'server_ip',
            'server_port',
            ]
        model = ServerModel

class LineSerializer(serializers.ModelSerializer):
    port = serializers.RelatedField(many=True)

    class Meta:
        fields = '__all__'
        model = SNMPLineModel

class SNMPSerializer(serializers.ModelSerializer):
    servers = ServerSerializer(many=True, read_only=True)  # It is ok
    meta_data = MetaDataSerializer(many=True, read_only=True)  # It's not ok
    line = LineSerializer(many=True, read_only=True)  # It's not ok
    address = serializers.CharField(source=SNMPLineModel.ip_address)  # It's not ok
    port = serializers.CharField(source=SNMPLineModel.port)  # It's not ok

    class Meta:
        fields = [
            'id',
            'servers',
            'name',
            'address',
            'port',
            'line',
            'meta_data'
            ]
        model = SNMPModel

views.py

from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse, JsonResponse

@csrf_exempt
def snippet_detail(request, name):
    try:
        snmp_conf = SNMPModel.objects.filter(name__contains=name)
    except SNMPModel.DoesNotExist:
        return HttpResponse(status=404)

    if request.method == 'GET':
        serializer = SNMPSerializer(snmp_conf, many=True)
        return JsonResponse(serializer.data, status=200, safe=False)

urls.py

from django.urls import path

urlpatterns = [
    path('snippets/<name>/', views.snippet_detail)
]

어떤 도움이라도 대단히 감사하겠습니다.

마이클 린지

serializers.SerializerMethodField()이 같은 관계에 추가 할 수있는 유용한 방법이다. get_meta_data()메서드를 호출하기 위해 fieldname을 평가하는 약간의 마술입니다.

주소와 포트는 단순한 관계로 보이며 line.FOO작동해야합니다.

class SNMPSerializer(serializers.ModelSerializer):
    servers = ServerSerializer(many=True, read_only=True)  # It is ok
    meta_data = serializers.SerializerMethodField()
    line = serializers.SerializerMethodField()
    address = serializers.CharField(source="line.ip_address", read_only=True)
    port = serializers.CharField(source="line.port" , read_only=True)

    class Meta:
        fields = ['id', 'servers', 'name', 'address', 'port', 'line', 'meta_data']
        model = SNMPModel

    def get_meta_data(self, instance):
        metadatamodels = MetaDataModel.objects.filter(snmp_device=instance)
        serializer = MetaDataSerializer(instance=metadatamodels, many=True, read_only=True)

        return serializer.data

    def get_line(self, instance):
        serializer = LineSerializer(instance.line, read_only=True)

        return serializer.data

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

DRF를 사용하여 django에서 중첩 된 관계형 모델을 직렬화하는 방법은 무엇입니까?

분류에서Dev

C #에서 JavascriptSerializer를 사용하여 중첩 된 엔터티 (모델)를 직렬화하는 방법은 무엇입니까?

분류에서Dev

Django : 관련 모델을 쿼리하여 중첩 된 사전을 만드는 가장 효율적인 방법은 무엇입니까?

분류에서Dev

JSON을 사용하여 Django 모델 관계를 얻는 방법은 무엇입니까?

분류에서Dev

Django 모델에서 관계를 정의하는 방법은 무엇입니까?

분류에서Dev

Django에서 중첩 된 다 대다 관계를 효율적으로 지우는 방법은 무엇입니까?

분류에서Dev

EmberData를 사용하여 EmberJS에서 중첩 된 모델로 구성된 약속을 반환하는 방법은 무엇입니까?

분류에서Dev

Django Rest Framework에서 ChoiceFields를 직렬화하는 방법은 무엇입니까?

분류에서Dev

Django Rest Framework-중첩 된 필드를 직렬화하는 방법

분류에서Dev

Django REST Framework에서 중복 된 쓰기 가능한 중첩 직렬 변환기없이 여러 모델 인스턴스를 만드는 방법은 무엇입니까?

분류에서Dev

cpp에서 msg-pack으로 중첩 된 메시지를 직렬화하는 방법은 무엇입니까?

분류에서Dev

Django DetailView에서 중첩 된 모델을 주문하는 방법

분류에서Dev

클래스 내부의 개인 메서드를 사용하여 PyTorch 저장된 모델을 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

Django REST JSON API : 중첩 된 복합 문서를 포함하는 방법은 무엇입니까?

분류에서Dev

중첩 된 JSON을 직렬화하는 방법은 무엇입니까?

분류에서Dev

XML 역 직렬화 중에 잘못된 열거 형 값을 무시하는 방법은 무엇입니까?

분류에서Dev

Django에서 모델 양식을 사용하여 객체를 편집하는 방법은 무엇입니까?

분류에서Dev

jquery를 사용하여 중첩 된 JSON 개체에서 값을 가져 오는 방법은 무엇입니까?

분류에서Dev

Apex를 사용하여 중첩 된 JSON에서 값을 읽는 방법은 무엇입니까?

분류에서Dev

연결된 foreignKeys를 사용하는 여러 모델을위한 Django 중첩 직렬 변환기

분류에서Dev

Django REST API. 사용자 ID로 ArrayField를 직렬화하고 사용자 모델의 JSON 객체로 검색하는 방법은 무엇입니까?

분류에서Dev

.NET에서 Reflection을 사용하여 둘러싸는 형식과 중첩 된 형식 매개 변수를 구분하는 방법은 무엇입니까?

분류에서Dev

dart에서 중첩 된 Tuple2 배열을 직렬화 / 역 직렬화하는 가장 좋은 방법은 무엇입니까 (List <List <Tuple2 >>)

분류에서Dev

Django Rest Framework 중첩 된 데이터를 필터링하는 방법은 무엇입니까?

분류에서Dev

API 전용 Rails에서 중첩 된 다 대다 관계를 저장하는 방법은 무엇입니까?

분류에서Dev

Django 모델 쿼리를 사용하여 누락 된 데이터를 얻는 방법은 무엇입니까?

분류에서Dev

Elastic을 사용하여 중첩 된 객체에 대해 하위 집계를 수행하는 방법은 무엇입니까?

분류에서Dev

Django에서 다중 사용자 모델을 올바르게 사용하는 방법은 무엇입니까?

분류에서Dev

Django에서 특정 ID를 직렬화하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    DRF를 사용하여 django에서 중첩 된 관계형 모델을 직렬화하는 방법은 무엇입니까?

  2. 2

    C #에서 JavascriptSerializer를 사용하여 중첩 된 엔터티 (모델)를 직렬화하는 방법은 무엇입니까?

  3. 3

    Django : 관련 모델을 쿼리하여 중첩 된 사전을 만드는 가장 효율적인 방법은 무엇입니까?

  4. 4

    JSON을 사용하여 Django 모델 관계를 얻는 방법은 무엇입니까?

  5. 5

    Django 모델에서 관계를 정의하는 방법은 무엇입니까?

  6. 6

    Django에서 중첩 된 다 대다 관계를 효율적으로 지우는 방법은 무엇입니까?

  7. 7

    EmberData를 사용하여 EmberJS에서 중첩 된 모델로 구성된 약속을 반환하는 방법은 무엇입니까?

  8. 8

    Django Rest Framework에서 ChoiceFields를 직렬화하는 방법은 무엇입니까?

  9. 9

    Django Rest Framework-중첩 된 필드를 직렬화하는 방법

  10. 10

    Django REST Framework에서 중복 된 쓰기 가능한 중첩 직렬 변환기없이 여러 모델 인스턴스를 만드는 방법은 무엇입니까?

  11. 11

    cpp에서 msg-pack으로 중첩 된 메시지를 직렬화하는 방법은 무엇입니까?

  12. 12

    Django DetailView에서 중첩 된 모델을 주문하는 방법

  13. 13

    클래스 내부의 개인 메서드를 사용하여 PyTorch 저장된 모델을 역 직렬화하는 방법은 무엇입니까?

  14. 14

    Django REST JSON API : 중첩 된 복합 문서를 포함하는 방법은 무엇입니까?

  15. 15

    중첩 된 JSON을 직렬화하는 방법은 무엇입니까?

  16. 16

    XML 역 직렬화 중에 잘못된 열거 형 값을 무시하는 방법은 무엇입니까?

  17. 17

    Django에서 모델 양식을 사용하여 객체를 편집하는 방법은 무엇입니까?

  18. 18

    jquery를 사용하여 중첩 된 JSON 개체에서 값을 가져 오는 방법은 무엇입니까?

  19. 19

    Apex를 사용하여 중첩 된 JSON에서 값을 읽는 방법은 무엇입니까?

  20. 20

    연결된 foreignKeys를 사용하는 여러 모델을위한 Django 중첩 직렬 변환기

  21. 21

    Django REST API. 사용자 ID로 ArrayField를 직렬화하고 사용자 모델의 JSON 객체로 검색하는 방법은 무엇입니까?

  22. 22

    .NET에서 Reflection을 사용하여 둘러싸는 형식과 중첩 된 형식 매개 변수를 구분하는 방법은 무엇입니까?

  23. 23

    dart에서 중첩 된 Tuple2 배열을 직렬화 / 역 직렬화하는 가장 좋은 방법은 무엇입니까 (List <List <Tuple2 >>)

  24. 24

    Django Rest Framework 중첩 된 데이터를 필터링하는 방법은 무엇입니까?

  25. 25

    API 전용 Rails에서 중첩 된 다 대다 관계를 저장하는 방법은 무엇입니까?

  26. 26

    Django 모델 쿼리를 사용하여 누락 된 데이터를 얻는 방법은 무엇입니까?

  27. 27

    Elastic을 사용하여 중첩 된 객체에 대해 하위 집계를 수행하는 방법은 무엇입니까?

  28. 28

    Django에서 다중 사용자 모델을 올바르게 사용하는 방법은 무엇입니까?

  29. 29

    Django에서 특정 ID를 직렬화하는 방법은 무엇입니까?

뜨겁다태그

보관