【问题标题】:Serializing one field from a ManyToManyField DRF从 ManyToManyField DRF 序列化一个字段
【发布时间】:2016-04-27 04:07:40
【问题描述】:

我已经发了很多帖子,DRF 文档(需要很多的爱),但我还没有找到如何在没有复杂的混乱的情况下做到这一点。

我需要这个输出:

[{"id":1,"name":"memcheck","subscribers":["foo", "bar"]}]

如果我采用 DRF 方式(或者至少文档如何指出我如何去做),那么我会得到以下输出:

[{"id":1,"name":"memcheck","subscribers":["Subscriber object", "Subscriber object"]}]

我尝试取消注释并使用第二个选项,然后得到以下输出:

[{"id":1,"name":"memcheck","subscribers":[{"name": "foo"}, {"name": "bar"}]}]

models.py

​​>
class Subscriber(models.Model):
    name = models.CharField(max_length=100)


class Check(models.Model):
   name = models.CharField(max_length=100)
   description = models.TextField(null=True, blank=True)
   subscribers = models.ManyToManyField(Subscriber)

serializers.py

​​>
class SubscriberSerializer(serializers.ModelSerializer):
    name = serializers.CharField()

    class Meta:
        fields = ('name', )


class CheckSerializer(serializers.ModelSerializer):
    # using source=('name') or variants like: 'subscribers__name', 'subscribers.name' 
    # doesnt work
    subscribers = serializers.ListSerializer(child=serializers.CharField())
    # subscribers = SubscriberSerializer(many=True) # --> see 2nd output

    class Meta:
        model = Check
        fields = ('id', 'name', 'subscribers')

在 ManyToMany 的其他情况下,我想要一个 dict 列表,但在这种情况下,我只想要一个名称为 attr.. 的简单列表。为什么这样做太难了?

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    你只需要一个SlugRelatedField:

    class CheckSerializer(serializers.ModelSerializer):
    
        subscribers = serializers.SlugRelatedField(many=True, read_only=True, slug_field='name')
    
        class Meta:
            model = Check
            fields = ('id', 'name', 'subscribers')
    

    【讨论】:

    • 好的,谢谢!,这行得通,现在我只需要接收一个类似的 json 并获取列表的元素并执行 get_or_create ... 有什么想法吗?
    • 好吧!如果您还想创建subscribers,那么它会有些复杂。您可以在另一个 post 上关注我的回答,了解有关如何实现这一目标的更多详细信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多