小编Dav*_*ull的帖子

如何在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()
Run Code Online (Sandbox Code Playgroud)

我正在使用Django REST框架来创建一个返回区域详细信息的资源,以及一个显示该区域的经过身份验证的用户权限的嵌套资源.输出应该是这样的:

{
    "name": "test", 
    "current_user_zone_permission": {
        "is_administrator": true, 
        "is_active": true
    }
} 
Run Code Online (Sandbox Code Playgroud)

我已经创建了这样的序列化器:

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')
Run Code Online (Sandbox Code Playgroud)

这样做的问题是,当我请求特定区域时,嵌套资源会为具有该区域权限的所有用户返回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 = …
Run Code Online (Sandbox Code Playgroud)

django django-rest-framework

57
推荐指数
3
解决办法
1万
查看次数

Django REST框架:嵌套对象可以在列表视图中访问其父对象的详细信息吗?

我试图实现一个嵌套资源,其中一个字段依赖于其父资源的值.

假设我们正在为一家公司建立一个系统,该系统提供有关其客户的信息以及该公司销售人员的销售数据.所以我们有两个模型,CustomerRep.代表可以向多个客户出售.

返回所有客户的URL: /api/1.0/customers/

特定客户的URL: /api/1.0/customers/123/

特定销售代表的客户特定信息的URL: /api/1.0/customers/123/rep/9/

请注意,rep URL包含客户ID和代表ID.

我希望客户URL返回一个嵌套资源,其中包含有关代表的摘要信息,以及指向该代表的完整客户特定信息的超链接.这是所有客户的URL输出:

[
    {
        "id": 100, 
        "customer_name": "DolManSaxLil",
        "rep": {
                "id": 4,
                "annual_sales": 1500.01,
                "name": "Fred",
                "url": "http://localhost:8000/api/1.0/customer/100/rep/4/"
               }
    },
    {
        "id": 200, 
        "customer_name": "Hotblack",
        "rep": {
                "id": 4,
                "annual_sales": 10500.42,
                "name": "Fred",
                "url": "http://localhost:8000/api/1.0/customer/200/rep/4/"
               }
    }
]
Run Code Online (Sandbox Code Playgroud)

为实现这一点,我们定义了两个序列化器

class CustomerSummarySerializer(serializers.HyperlinkedModelSerializer):
    id = ...
    name = ...
    rep = RepSummarySerializer(read_only=True)

class RepSummarySerializer(serializers.HyperlinkedModelSerializer):
    id = ...
    annual_sales = ...
    name = ....
    url = serializers.SerializerMethodField('get_rep_url')
Run Code Online (Sandbox Code Playgroud)

我面临的问题是我无法弄清楚如何从函数中访问当前的customer.id RepSummarySerializer.get_rep_url. …

django django-rest-framework

17
推荐指数
1
解决办法
4293
查看次数

为什么要让一个类私有地遵守协议?

我一直在关注Apple的MVCNetworking示例项目,并且部分接口定义令AppDelegate我感到困惑.在.h文件中我们有:

@interface AppDelegate : NSObject
{
  ...
Run Code Online (Sandbox Code Playgroud)

但是在.m文件中我们有这个:

@interface AppDelegate () <SetupViewControllerDelegate>
  ...
Run Code Online (Sandbox Code Playgroud)

所以这个类是私有地符合协议.但是你为什么要这样做而不是在标题中公开声明呢?

cocoa-touch protocols objective-c class-extensions

5
推荐指数
2
解决办法
583
查看次数