Как включить в 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__'