Django REST 框架 : Can a nested object access its parent object's details in a List View?

标签 django django-rest-framework

我正在尝试实现一个嵌套资源,其中一个字段取决于其父资源的值。

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

返回所有客户的 URL:/api/1.0/customers/
特定客户的 URL:/api/1.0/customers/123/
特定销售代表的客户特定信息的 URL:/api/1.0/customers/123/rep/9/
请注意,代表 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/"
               }
    }
]

为了实现这一点,我们定义了两个序列化器:
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')

我面临的问题是我无法弄清楚如何从函数 RepSummarySerializer.get_rep_url 访问当前的 customer.id。 .由于客户在 self.parent.obj 中,因此可以在详细 View 中查看。 :
def get_rep_url(self, obj):
    customer_id = self.parent.obj.id
    url = reverse('api_customer_rep', 
              kwargs={'customer_id': customer_id,
                      'rep_id': obj.id},
                      request=serializer.context.get('request'))
    return url

但是,在 ListView 中,self.parent.obj是客户对象的 QuerySet,我看不到任何识别当前客户的方法。有没有办法做到这一点?我错过了什么明显的东西吗?

最佳答案

清晰的时刻:解决方案是使用 SerializerMethodField实例化 RepSummarySerializer并通过 customer_id在上下文中:

class CustomerSummarySerializer(serializers.HyperlinkedModelSerializer):
    id = ...
    name = ...
    rep = serializers.SerializerMethodField('get_rep')


    def get_rep(self, obj):
        rep = obj.rep
        serializer_context = {'request': self.context.get('request'),
                              'customer_id': obj.id}
        serializer = RepSummarySerializer(rep, context=serializer_context)
        return serializer.data
customer_id现在可以访问 RepSummarySerializer.get_rep_url像这样:
def get_rep_url(self, obj):
    customer_id = self.context.get('customer_id')
    ...

不知道为什么我三个小时前没有想到这个。

关于Django REST 框架 : Can a nested object access its parent object's details in a List View?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18539379/

相关文章:

python - 向 models.py 添加了额外的模型,但我得到 `OperationalError: no such table`

python - 在 Django 1.11 和 django _rest 框架中的嵌套序列化器上实现更新方法

python - Django REST 框架 : creating hierarchical objects using URL arguments

python - Django 数据迁移类型转换问题

python - 将 Django 应用程序部署到 AWS 时出现 "ValueError: too many values to unpack"

django - App Engine 上的 django-nonrel 中的模型继承

javascript - Django——将字典传递给模板并绘制折线图

javascript - Json 转储到单独的变量

python - 尝试基于嵌套模型外键过滤 django View 序列化器

python - 尝试获取 Django 中字段的值时出现 AttributeError - 外键关系