В моем приложении у меня есть следующие модели:Как применить фильтр к вложенному ресурсу в структуре Django REST?
class Zone(models.Model):
name = models.SlugField()
class ZonePermission(models.Model):
zone = models.ForeignKey('Zone')
user = models.ForeignKey(User)
is_administrator = models.BooleanField()
is_active = models.BooleanField()
Я использую рамку Django REST создать ресурс, который возвращает деталь зоны плюс вложенный ресурс с указанием разрешения, прошедшей проверкой подлинности пользователя для этой зоны. Вывод должен быть чем-то вроде этого:
{
"name": "test",
"current_user_zone_permission": {
"is_administrator": true,
"is_active": true
}
}
Я создал сериализаторы так:
class ZonePermissionSerializer(serializers.ModelSerializer):
class Meta:
model = ZonePermission
fields = ('is_administrator', 'is_active')
class ZoneSerializer(serializers.HyperlinkedModelSerializer):
current_user_zone_permission = ZonePermissionSerializer(source='zonepermission_set')
class Meta:
model = Zone
fields = ('name', 'current_user_zone_permission')
проблема состоит в том, что, когда я прошу конкретную зону, вложенная ресурс возвращает ZonePermission записи for все пользователи пользователей с правами для этой зоны. Есть ли способ применения фильтра по request.user
к вложенному ресурсу?
BTW Я не хочу использовать HyperlinkedIdentityField
для этого (чтобы свести к минимуму HTTP-запросы).
Решение
Это решение, которое я реализован на основе ниже ответ. Я добавил следующий код к своему классу сериализации:
current_user_zone_permission = serializers.SerializerMethodField('get_user_zone_permission')
def get_user_zone_permission(self, obj):
user = self.context['request'].user
zone_permission = ZonePermission.objects.get(zone=obj, user=user)
serializer = ZonePermissionSerializer(zone_permission)
return serializer.data
Большое спасибо за решение!
Спасибо за ваше предложение. Может ли 'SerializerMethodField' вернуть структуру или просто плоское поле? –
Он может вернуть структуру. – user2437225
У меня будет такой подход - спасибо. Если никакие другие «официальные» предложения не придут, я приму это как ответ. –