Django REST Framework: Работа с моделями, которые косвенно связаны друг с другом через глубокую вложенность
У меня есть несколько моделей в Django:
Device
Region
Installation
: имеетDevice
иRegion
:region = models.ForeignKey(Region, related_name='installations') device = models.ForeignKey(Device, related_name='installations')
Dashboard
: имеет несколькоRegion
s:regions = models.ManyToManyField(Region, related_name='dashboards')
Если меня интересует связь между экземплярами Device
и Dashboard
, каковы лучшие практики для этих типов моделей в Django? Например, вот как я сериализую Dashboard
, если я хочу увидеть связанные с ним Device
s:
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)