【问题标题】:Get StringRelatedField along with PrimaryKeyRelatedField using Serializer in DRF在 DRF 中使用 Serializer 获取 StringRelatedField 和 PrimaryKeyRelatedField
【发布时间】:2018-04-27 12:06:35
【问题描述】:

抱歉这个新手问题,但我根本找不到阅读手册的方式。

型号

    #Subject
class TemaPai(models.Model):
    subject = models.TextField()
    disciplines = models.ManyToManyField(Materia)

    # order = models.IntegerField(blank=True, null=True)

    def __str__(self):
        return self.subject

    class Meta:
        verbose_name_plural = "temas-pais (subjects)"


# Order and junction
class TemaPaiOrdem(models.Model):
    subject = models.ForeignKey(TemaPai, on_delete=models.CASCADE)
    discipline = models.ForeignKey(Materia, on_delete=models.CASCADE)
    order = models.IntegerField()

    def __str__(self):
        var2 = self.subject.subject
        var = self.discipline.discipline
        return var2 + ' - ' + var

    class Meta:
        verbose_name_plural = "Temas-pais-ordem"
        unique_together = ('subject', 'discipline')

序列化器

class TemaPaiSerializer(serializers.ModelSerializer):

    disciplines = serializers.PrimaryKeyRelatedField(many=True, queryset=Materia.objects.all())
    class Meta:
        model = TemaPai
        fields = ('id', 'subject', 'url', 'disciplines')


class TemaPaiOrdemSerializer(serializers.ModelSerializer):

    discipline = serializers.PrimaryKeyRelatedField(queryset=Materia.objects.all())
    subject = serializers.PrimaryKeyRelatedField(queryset=TemaPai.objects.all())
    class Meta:
        model = TemaPaiOrdem
        fields = ('id', 'subject','discipline', 'order')

好吧,TemaPaiOrdemSerializer 给了我一个这样的列表:

[
    {
        "id": 1,
        "subject": 1,
        "discipline": 1,
        "order": 1
    },
    {
        "id": 2,
        "subject": 2,
        "discipline": 1,
        "order": 11
    }
]

没关系。但我也想检索主题字符串表示(来自 TemaPai 模型),作为只读字段。所以我想要的列表是这样的:

[
    {
        "id": 1,
        "subject": 1,
        "subject_name": "Introduction",
        "discipline": 1,
        "order": 1
    },
    {
        "id": 2,
        "subject": 2,
        "subject_name": "Advanced stuff",
        "discipline": 1,
        "order": 11
    }
]

我正在尝试使用

subject_name = serializers.ReadOnlyField(source:'subject')

没有成功。任何提示将不胜感激。

【问题讨论】:

    标签: django serialization django-rest-framework


    【解决方案1】:

    使用,

    subject_name = serializers.StringRelatedField(source='subject',read_only=True)
    


    因此您的序列化程序会像,

    class TemaPaiOrdemSerializer(serializers.ModelSerializer):
        discipline = serializers.PrimaryKeyRelatedField(queryset=Materia.objects.all())
        subject = serializers.PrimaryKeyRelatedField(queryset=TemaPai.objects.all())
        subject_name = serializers.StringRelatedField(source='subject',read_only=True)
    
        class Meta:
            model = TemaPaiOrdem
            fields = ('id', 'subject', 'subject_name', 'discipline', 'order')
    

    【讨论】:

    • 像魅力一样工作。我不知道我可以将source=StringRelatedField 一起使用。谢谢,伙计!
    【解决方案2】:

    您可以在source 参数中使用. 来查找相关模型的字段,如下所示:

    subject_name = serializers.ReadOnlyField(source='subject.subject')
    

    【讨论】:

    • @LuisRock 是的,这是我的错误。您可以使用.。但是 Jerin 的回答看起来更干净。
    • 我一直在尝试使用source="subject__subject",但. 对我有用。我想知道为什么 DRF 不像 Django 的其他部分那样使用双下划线。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 2021-11-09
    • 2021-11-19
    • 1970-01-01
    • 2020-07-02
    • 2020-12-19
    • 2018-03-30
    相关资源
    最近更新 更多