使用DRF中的Serializer获取StringRelatedField以及PrimaryKeyRelatedField

时间:2018-04-27 12:06:35

标签: django serialization django-rest-framework

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

模型

    #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模型),作为read_only字段。所以我想要的列表是这样的:

[
    {
        "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')

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

2 个答案:

答案 0 :(得分:2)

使用,

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')

答案 1 :(得分:1)

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

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