Django REST Framework: Работа с моделями, которые косвенно связаны друг с другом через глубокую вложенность
У меня есть несколько моделей в Django:
DeviceRegionInstallation: имеетDeviceиRegion:region = models.ForeignKey(Region, related_name='installations') device = models.ForeignKey(Device, related_name='installations')Dashboard: имеет несколькоRegions:regions = models.ManyToManyField(Region, related_name='dashboards')
Если меня интересует связь между экземплярами Device и Dashboard, каковы лучшие практики для этих типов моделей в Django? Например, вот как я сериализую Dashboard, если я хочу увидеть связанные с ним Devices:
class DeviceSerializer(serializers.ModelSerializer):
class Meta:
model = Device
fields = ['uuid', 'device_type']
class DashboardSerializer(serializers.ModelSerializer):
devices = serializers.SerializerMethodField()
def get_devices(self, obj):
flat_devices = []
for region in obj.regions.all():
for installation in region.installations.all():
flat_devices.append(installation.device)
return DeviceSerializer(flat_devices, many=True).data
class Meta:
model = Dashboard
fields = ['uuid', 'devices']
Предлагает ли Django лучший способ сделать это?
А как насчет обратного, то есть сериализатора Device, который включает список Dashboard, в которых он появляется?
Используйте фильтрацию с поиском отношений:
device = Device.objects.get(...) # just picturing it's a single object
Dashboard.objects.filter(regions__installations__device=device)
Вы также можете изменить существующий for loops на один filter метод:
dashboard = Dashboard.objects.get(...) # just picturing it's a single object
devices = Device.objects.filter(installations__region__dashboards=dashboard)