Django REST Framework: Работа с моделями, которые косвенно связаны друг с другом через глубокую вложенность

У меня есть несколько моделей в Django:

  • Device

  • Region

  • Installation: имеет 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)
Вернуться на верх