Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将django模型对象的嵌套序列化列表定制为键/值对?_Django_Django Rest Framework - Fatal编程技术网

如何将django模型对象的嵌套序列化列表定制为键/值对?

如何将django模型对象的嵌套序列化列表定制为键/值对?,django,django-rest-framework,Django,Django Rest Framework,假设我有这样的模型: class Device(models.Model): name = models.CharField(max_length=100,null=True) model = models.CharField(max_length=100,null=True) lab = models.ForeignKey(Lab,null=True, related_name='devices') class Lab(models.Model): name

假设我有这样的模型:

class Device(models.Model):
    name = models.CharField(max_length=100,null=True)
    model = models.CharField(max_length=100,null=True)
    lab = models.ForeignKey(Lab,null=True, related_name='devices')

class Lab(models.Model):
    name = models.CharField(max_length=100)
一个实验室可以有多个设备。 当我创建序列化程序时,我可以得到如下结果:

{'name':'My Lab','devices':[{'name':'Device 1','model':'iPhone'},{'name':'Device 2','model':'iPad'}]}
但是,我想返回的是键/值对,而不是设备列表,如下所示:

{'name':'My Lab','devices':{'Device 1':{'model':'iPhone'},'Device 2':{'model':'iPad'}}}

我在想象我必须使用序列化方法字段来实现这一点,但我很难理解它。

好吧,有时候写出来的问题可以帮助我的大脑找到答案

这就是我想到的:

class LabSerializer(serializers.ModelSerializer):
    devices = serializers.SerializerMethodField()

    class Meta:
        """Meta class to map serializer's fields with the model fields."""
        model = Lab
        fields = ('name','devices')

    def get_devices(self, obj):
        devices = {}
        for d in Device.objects.filter(lab = obj):
            serializer = DeviceSerializer(d)
            devices[d.name] = serializer.data
        return devices

我想这是最好的办法。我对用例表示怀疑,但如果这是您需要的,那就是解决方法。谢谢。就用例而言,我不希望能够在O(1)时间内从实验室获取任何设备的信息。