【问题标题】:Django - SlugRelated to return full objectDjango - SlugRelated 以返回完整对象
【发布时间】:2015-11-07 15:15:37
【问题描述】:

我在 DRF 工作,并且有一个如下所示的序列化器

class PendingRequestSerializer(serializers.ModelSerializer):

    driver = serializers.SlugRelatedField(
        slug_field='username',
        queryset=User.objects.all()
    )

    passenger = serializers.SlugRelatedField(
        slug_field='username',
        queryset=User.objects.all()
    )

    class Meta:
        model = PendingRequest
        fields = ('passenger', 'driver', 'ride', )
        read_only_fields = ('passenger', ) 

型号:

class PendingRequest(models.Model):
    driver = models.ForeignKey('auth.User', related_name='driver_pending_requests')
    passenger = models.ForeignKey('auth.User', related_name='passenger_pending_requests')
    ride = models.ForeignKey(Ride)

我可以通过SlugRelatedField成功返回司机乘客用户名

现在 - 对于 ride 字段,我想获得 整个 Ride 对象,而不仅仅是一个字段(如乘客和司机)。

怎么做?

【问题讨论】:

    标签: python serialization django-models django-rest-framework


    【解决方案1】:

    您可以使用嵌套序列化。

    DRF 提供了一个名为 nested serializers 的功能。

    对于您的示例,您可以执行以下操作:

    class PendingRequestSerializer(serializers.ModelSerializer):
    
        driver = serializers.SlugRelatedField(
            slug_field='username',
            queryset=User.objects.all()
        )
    
        passenger = serializers.SlugRelatedField(
            slug_field='username',
            queryset=User.objects.all()
        )
    
        ride = RideSerializer()
    
        class Meta:
            model = PendingRequest
            fields = ('passenger', 'driver', 'ride', )
            read_only_fields = ('passenger', ) 
    

    这将生成正常的 JSON,而不是在 Ride 字段中显示骑行实例的 PK,而是嵌套整个骑行对象。 你当然需要写 RideSerializer 才能让它工作。

    【讨论】:

    • 感谢您的回答。问题在于,当我创建 PendingRequest (POST) 时,我将 PK.我想继续这样做(使用 pk 发布),当我发送 Get - 以获取整个字段时。这可能吗?
    • @OfekAgmon 好吧,有几个选项,我认为所有这些都不像我想要的那么顺利。一种是对 POST 和 GET 使用不同的视图并使用不同的序列化程序,一种具有嵌套乘车,一种没有。另一个更脏的是在你的视图中决定调用哪个序列化程序......这也取决于你使用的是通用视图还是基础 APIView。
    • @OfekAgmon 另一种选择是保持原样 (PK) 并添加一个附加字段,即 SerializerMethodField,它将以不同的字段名称返回乘车对象。
    • 谢谢你们的回答。我最终使用了两个序列化器——一个用于 POST,一个用于 GET。谢谢你的建议:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多