Django:一对多和多对一序列化器和查询

dsf9zpds  于 2022-12-05  发布在  Go
关注(0)|答案(1)|浏览(170)

我有一个类似这样的关系:一个城市有一对多的建筑;一个建筑物具有零到多个设备。
用户必须能够通过其PK请求城市,作为响应接收城市、城市中的建筑物以及这些建筑物中的设备。
我知道外键在创建模型时是必要的,如下所示:

class City(models.Model):
    #Columns here

class Building(models.Model):
    cityId = models.ForeignKey(City, on_delete=models.CASCADE)
    #Columns here

class Device(models.Model):
    buildingId = models.ForeignKey(Building, on_delete=models.CASCADE)
    #Columns here

我遇到的问题是如何编写序列化程序和查询。到目前为止,我的序列化程序只包含与该表的列相对应的字段:

class CitySerializer(serializers.ModelSerializer):
    class Meta:
        model = City
        fields = ['id', ...]

class BuildingSerializer(serializers.ModelSerializer):
    class Meta:
        model = Building
        fields = ['id', 'cityId', ...]

class DeviceSerializer(serializers.ModelSerializer):
    class Meta:
        model = Device
        fields = ['id', 'buildingId', ...]

但是,当我必须响应城市的GET请求时,我只知道如何使用嵌套的for循环在通过输入的ID找到城市后获取建筑物和设备数据。我认为有更好的方法,但我在网上很难找到明确的答案。

igetnqfo

igetnqfo1#

在您模型中使用related_name关键字,您可以了解更多--下面是它工作原理--
1.定义模型并将related_name添加到外键中,作为-

class City(models.Model):
     ##fields

 class Building(models.Model):
     cityId = models.ForeignKey(City, on_delete=models.CASCADE,related_name='abc')

 class Device(models.Model):
     buildingId = models.ForeignKey(Building, on_delete=models.CASCADE, related_name='xyz')

1.然后以相反的顺序定义序列化程序,并在序列化程序字段中添加模型的related_name--

class DeviceSerializer(serializers.ModelSerializer):
     class Meta:
         model = Device
         fields = ['id', 'buildingId', ...]

 class BuildingSerializer(serializers.ModelSerializer):
     xyz = DeviceSerializer(many=True, read_only=True)
     class Meta:
         model = Building
         fields = ['id', 'cityId', xyz ...]

 class CitySerializer(serializers.ModelSerializer):
     abc = BuildingSerializer(many=True, read_only=True)
     class Meta:
         model = City
         fields = ['id', 'abc' ...]

现在当你将设法得到这个城市时,你将得到所有的建筑物rel;以及与每个建筑物相关的所有设备。
还有一个方法叫做serializermethodfield,它在很多领域都很有用,你可以根据自己的选择使用任何一个。
希望这对你有帮助。

相关问题