Как включить в GET-запрос JSON список внешних ключей модели в Django?

В моих моделях есть пользователи, у которых может быть несколько устройств. Когда я делаю GET-запрос к пользователям, он возвращает только поля, указанные в модели пользователя, как и должно быть. Но я хочу иметь возможность включить в JSON, возвращаемый GET-запросом, список устройств, которые есть у пользователя. Как я могу это сделать? Было бы неплохо указать в строке запроса булево или что-то вроде того, чтобы указать, хочу ли я, чтобы в JSON пользователя был или не был список устройств. Но это только моя идея, возможно, это можно сделать по-другому и лучше. Также, я новичок в Django, и я был бы признателен за большое количество примеров кода, чтобы лучше понять, если это возможно.

Вот мои модели:

class User(models.Model):
    name = models.CharField(max_length=100)
    birth_date = models.DateField()
    address = models.CharField(max_length=200)

class Device(models.Model):
    description = models.CharField(max_length=200)
    location = models.CharField(max_length=200)
    max_energy_consumption = models.FloatField()
    avg_energy_consuumption = models.FloatField()
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)

Мои сериализаторы:

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'

class DeviceSerializer(serializers.ModelSerializer):
    class Meta:
        model = Device
        fields = '__all__'

И следующие наборы ModelViewSet по умолчанию для CRUD api вызовов:

class UserViewSet(ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer


class DeviceViewSet(ModelViewSet):
    queryset = Device.objects.all()
    serializer_class = DeviceSerializer

Есть несколько различных способов, самый простой из которых - добавить property в модель User и добавить ее в сериализатор

class User(models.Model):
    name = models.CharField(max_length=100)
    birth_date = models.DateField()
    address = models.CharField(max_length=200)


    @property
    def devices(self):
        return Device.objects.filter(user_id=self.id).values("location", "description").distinct()


class UserSerializer(serializers.ModelSerializer):
    devices = serializers.ReadOnlyField()
    class Meta:
        model = User
        fields = '__all__'
Вернуться на верх