在我的应用程序中,我有以下型号:

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睡觉框架创建一个返回区域详细信息的资源,以及一个显示经过身份验证的用户对该区域的权限的嵌套资源.输出应如下所示:

{
    "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')

这样做的问题是,当我请求特定区域时,嵌套的资源返回all个具有该区域权限的用户的ZonePermission记录.有没有办法对嵌套的资源应用request.user时的过滤?

顺便说一句,我不想使用HyperlinkedIdentityField来实现这一点(以最小化http请求).

Solution

这是我根据下面的答案实现的解决方案.我将以下代码添加到我的序列化程序类中:

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,让该方法查询并返回所需的值.您可以通过self.context['request'].user访问该方法中的request.user.

不过,这似乎有点像黑客.我对DRF还比较陌生,所以也许有经验的人可以加入进来.

Django相关问答推荐

如何在Django中将字段及其数据从一个模型添加到另一个模型?

Django没有';t显示黄页

如何在Django REST框架中实现ForeignKey搜索

Django Rest Framework 认证类覆盖 request.user

Django 关系嵌套related_name

Django:使用相同的外键在不同的应用程序中 Select 多个列

如何在 ModelViewSet 逻辑中读取查询字符串值?

Django授权判断具有通配符模式的URL

Django `UniqueConstraint` 异常处理方式与 'unique=True' 相同

Django过滤器查询外键

在 Django 过滤器语句中,__exact 和等号 (=) 有什么区别?

如何使用 select_for_update 在 Django 中获取查询?

virtualenv(python3.4), pip install mysqlclient 错误

Django:使用 ModelForm 编辑现有数据库条目

有日期时间±无穷大吗?

Table doesn't exist表不存在

关闭 Django Rest Framework ModelViewSet 的自动分页

在 Django 中查询 top x 元素

ImportError:没有名为 django_filters 的模块

Django 字符串到日期格式