如何使用django-rest序列化django中的一些嵌套关系模型?

本雅明·贾法里(Benyamin Jafari)

我有一些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
    }

我的问题:

现在,我该如何通过上述方式创建上述json django-rest-framework

我对多对多没问题。实际上,我的问题在于他们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()评估字段名称以调用该方法有点魔术。

地址和端口似乎是一个简单的关系,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

使用ManyToManyField序列化模型时的Django REST错误

来自分类Dev

如何在Django REST中序列化层次结构关系

来自分类Dev

如何将绝对URL字段放入Django Rest框架的序列化器模型中?

来自分类Dev

如何使用Rest Framework在Django中序列化关系OneToOne?

来自分类Dev

如何在Django-rest-framework序列化器中的关系模型中获得额外的列?

来自分类Dev

在Django REST框架中序列化一对多关系

来自分类Dev

Django Rest Framework在POST中接收主键值,并以嵌套序列化程序的形式返回模型对象

来自分类Dev

嵌套关系序列化程序中的Django Rest Framework模型ID字段

来自分类Dev

如何在Django Rest Framework嵌套序列化程序中动态更改深度?

来自分类Dev

使用Django的ORM和Django Rest框架序列化嵌套关系的查询集的正确方法?

来自分类Dev

如何在Django Rest中序列化关系?

来自分类Dev

将反向关系与Django-rest-framework的序列化器一起使用

来自分类Dev

在Django-rest-framework中序列化通用关系

来自分类Dev

嵌套序列化程序中的Django Rest Framework关系查询

来自分类Dev

在Django Rest中使用中间模型序列化多对多关系

来自分类Dev

如何在Django REST Framework中创建多个没有重复的可写嵌套序列化器的模型实例?

来自分类Dev

Django:在序列化器中查询关系模型

来自分类Dev

Django rest框架使用FK序列化模型

来自分类Dev

Django Rest Framework-如何序列化嵌套字段

来自分类Dev

如何在序列化器/视图Django REST Framework中合并多个模型?

来自分类Dev

如何使用DRF在Django中序列化一些嵌套的关系模型?

来自分类Dev

如何在Django REST中序列化层次结构关系

来自分类Dev

如何在django rest框架中将相关字段包括到模型序列化中?

来自分类Dev

如何只序列化一些类变量?

来自分类Dev

Django Rest Framework序列化器的形式和嵌套关系

来自分类Dev

在 django rest 框架的一个序列化器中创建两个模型

来自分类Dev

将参数传递给 Django REST 框架序列化程序以与模型一起使用

来自分类Dev

如何在django rest框架中序列化多个关系模型

来自分类Dev

如何在 Django Rest Framework 中使用序列化程序检索具有嵌套关系的模型数据?

Related 相关文章

  1. 1

    使用ManyToManyField序列化模型时的Django REST错误

  2. 2

    如何在Django REST中序列化层次结构关系

  3. 3

    如何将绝对URL字段放入Django Rest框架的序列化器模型中?

  4. 4

    如何使用Rest Framework在Django中序列化关系OneToOne?

  5. 5

    如何在Django-rest-framework序列化器中的关系模型中获得额外的列?

  6. 6

    在Django REST框架中序列化一对多关系

  7. 7

    Django Rest Framework在POST中接收主键值,并以嵌套序列化程序的形式返回模型对象

  8. 8

    嵌套关系序列化程序中的Django Rest Framework模型ID字段

  9. 9

    如何在Django Rest Framework嵌套序列化程序中动态更改深度?

  10. 10

    使用Django的ORM和Django Rest框架序列化嵌套关系的查询集的正确方法?

  11. 11

    如何在Django Rest中序列化关系?

  12. 12

    将反向关系与Django-rest-framework的序列化器一起使用

  13. 13

    在Django-rest-framework中序列化通用关系

  14. 14

    嵌套序列化程序中的Django Rest Framework关系查询

  15. 15

    在Django Rest中使用中间模型序列化多对多关系

  16. 16

    如何在Django REST Framework中创建多个没有重复的可写嵌套序列化器的模型实例?

  17. 17

    Django:在序列化器中查询关系模型

  18. 18

    Django rest框架使用FK序列化模型

  19. 19

    Django Rest Framework-如何序列化嵌套字段

  20. 20

    如何在序列化器/视图Django REST Framework中合并多个模型?

  21. 21

    如何使用DRF在Django中序列化一些嵌套的关系模型?

  22. 22

    如何在Django REST中序列化层次结构关系

  23. 23

    如何在django rest框架中将相关字段包括到模型序列化中?

  24. 24

    如何只序列化一些类变量?

  25. 25

    Django Rest Framework序列化器的形式和嵌套关系

  26. 26

    在 django rest 框架的一个序列化器中创建两个模型

  27. 27

    将参数传递给 Django REST 框架序列化程序以与模型一起使用

  28. 28

    如何在django rest框架中序列化多个关系模型

  29. 29

    如何在 Django Rest Framework 中使用序列化程序检索具有嵌套关系的模型数据?

热门标签

归档