在我的應用我有以下型號:如何將過濾器應用於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記錄對於全部爲的用戶具有該區域的權限。有什麼方法可以將request.user
上的過濾器應用於嵌套資源?
順便說一句我不想使用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
我會採取這種方法 - 謝謝。如果沒有其他「官方」建議通過,我會接受這個答案。 –