Trong ứng dụng của tôi, tôi có các mô hình sau:Làm cách nào để áp dụng bộ lọc cho tài nguyên lồng nhau trong khung công tác REST của Django?
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()
Tôi đang sử dụng khuôn khổ Django REST để tạo ra một nguồn lực mà trả về chi tiết khu vực cộng với một tài nguyên lồng nhau thể hiện quyền của người sử dụng chứng thực cho vùng đó. Sản lượng nên được một cái gì đó như thế này:
{
"name": "test",
"current_user_zone_permission": {
"is_administrator": true,
"is_active": true
}
}
Tôi đã tạo serializers như vậy:
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')
Vấn đề với điều này là khi tôi yêu cầu một khu vực đặc biệt, tài nguyên lồng nhau trả về hồ sơ ZonePermission cho tất cả người dùng có quyền đối với khu vực đó. Có cách nào áp dụng bộ lọc trên request.user
vào tài nguyên lồng nhau không?
BTW Tôi không muốn sử dụng số HyperlinkedIdentityField
cho điều này (để giảm thiểu yêu cầu http).
Giải pháp
Đây là giải pháp tôi đã triển khai dựa trên câu trả lời bên dưới. Tôi đã thêm mã sau vào lớp serializer của tôi:
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
Cảm ơn rất nhiều vì giải pháp!
Cảm ơn đề nghị của bạn. Có thể một 'SerializerMethodField' trả về một cấu trúc hay chỉ là một trường phẳng? –
Nó có thể trả về một cấu trúc. – user2437225
Tôi sẽ có cách tiếp cận này - cảm ơn. Nếu không có đề xuất 'chính thức' nào khác đến thì tôi sẽ chấp nhận điều này làm câu trả lời. –