代码之家  ›  专栏  ›  技术社区  ›  Fusion

django rest framework serializer-多次序列化单个模型字段

  •  0
  • Fusion  · 技术社区  · 6 年前

    我想在输出JSON中多次序列化一个相关字段。第一个应该包含 pk 相关对象的,第二个表示应该是超链接。有什么好办法吗?我知道 SerializerMethodField 但我觉得这是不优雅的做法。

    我的模型:

     class Person(models.Model):
        first_name = models.CharField()
        ...
    
     class Order(models.Model):
        title = models.CharField()
        person = models.ForeignKey(Person, related_name='orders')
    

    我想要什么:

    像这样序列化我的订单模型:

    {
        "title": "Alice in wonderland",
        "person": 1,  # represents persons's primary key
        "person_url": "/person-detail/1" 
    }
    

    我尝试的/我的序列化程序:

    class OrderSerializer(serializers.ModelSerializer):
        person = serializers.IntegerField()
        person_url = serializers.HyperlinkedRelatedField(
            view_name='myapp:user-profile',
            lookup_field='pk'
        )
    
        class Meta:
            model = Order
            fields = ['title', 'person', 'person_url']
            read_only_fields = ('__all__',)
    

    但这件事从逻辑上讲,Django在抱怨失踪 person_url 数据库中的字段。如何着手?

    1 回复  |  直到 6 年前
        1
  •  2
  •   RishiG    6 年前

    你的方法很接近。几个注意事项:

    1. 您不需要指定 person 整型字段如果你想要pk,你可以免费得到它。( ModelSerializer 将自动创建 PrimaryKeyRelatedField 打电话 )
    2. 您不必指定 fields 在这里。DRF提供自动生成的字段和序列化程序上显式定义的字段
    3. lookup_field 默认为 pk
    4. 假设您的视图名称是正确的(我看不到您的URL),那么您的 HyperlinkRelatedField 是一个 source 属性

    把它放在一起,像这样的事情应该是有效的:

    class OrderSerializer(serializers.ModelSerializer):
        person_url = serializers.HyperlinkedRelatedField(
            view_name='myapp:user-profile',
            source='person',
            read_only=True
        )
    
        class Meta:
            model = Order
            fields='__all__'
            read_only_fields = ('__all__',)
    

    注意:对于我的urls.py,我有一个更像 person-detail .