在Django-rest Serializer中获取外键的值

时间:2018-10-18 12:41:51

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

我试图获取外键的值,但是我只得到id,下面的代码

Model:
    class DocumentType(models.Model):
    """Model for type of documents type system is indexing"""
    title = models.CharField(max_length=255, null=False)

def __str__(self):
    return "{}".format(self.title)


class DocumentsCount(models.Model):
    """Model for type of documents count system is indexing"""
    document_type = models.ForeignKey(DocumentType, on_delete=models.CASCADE, related_name='doc_title')
    count = models.IntegerField(default=0)

    def __str__(self):
        return "{}".format(self.document_type)

序列化器

class DocumentCountsSerializer(serializers.ModelSerializer):
title = serializers.ReadOnlyField(source="DocumentType.title")

class Meta:
    model = DocumentsCount
    fields = "__all__"

我从API获取结果

    {
    "id": 5,
    "count": 2,
    "document_type": 3
}

document_type应该是title,但是我正在获取ID

这是查询

 queryset = DocumentsCount.objects.select_related('document_type')

我不确定自己做错了什么,实际上我在打印queryset并在sqlite中运行时会得到ID和标题

4 个答案:

答案 0 :(得分:1)

您在指定来源时出错。将其更改为source="document_type.title",因为您想说“使用此实例的title字段的document_type”:

class DocumentCountsSerializer(serializers.ModelSerializer):
    title = serializers.CharField(source="document_type.title", read_only=True)

    class Meta:
        model = DocumentsCount
        fields = "__all__"

您遇到了问题,因为在DocumentType模型上没有定义字段DocumentsCount(字段为document_type,它是DocumentType的外键)。

答案 1 :(得分:0)

更新您的模型以支持这样的嵌套序列化器

class DocumentTypeSerializer(serializers.ModelSerializer):
       class Meta:
            model = DocumentType
            fields = "__all__"
class DocumentCountsSerializer(serializers.ModelSerializer):
    doc_title = DocumentTypeSerializer(many=True)

    class Meta:
        model = DocumentsCount
        fields = "__all__"

通过调用DocumentCountsSerializer来获取数据会自动获取相关的外键值。

按如下所示调用序列化器:

queryset = DocumentsCount.objects.all()
serializer = serializers.DocumentTypeSerializer(queryset, many=True)

答案 2 :(得分:0)

a_k_v发布的答案是正确的,并且将在```{r} result <- mydata %>% count(months(as.Date(orderdate))) result ``` 中返回嵌套的序列化器。

或者,如果您希望通过以下方式回复:

DocumentCountsSerializer()

您需要相应地更新序列化程序。考虑到您使用select_related运行的查询,您的序列化器将如下所示:

{
    "id": 5,
    "count": 2,
    "title": "title here"
}

答案 3 :(得分:0)

最简单的方法是在制作序列化程序时使用rest框架的 StringRelatedField 属性/属性。它根据模型的 __ str __(self) 中的定义给出输出。

查看示例(如果一对多:您可以使用many = True):

您的代码段将像这样:

class DocumentCountsSerializer(serializers.ModelSerializer):
    document_type = serializers.StringRelatedField()

    class Meta:
        model = DocumentsCount
        fields = "__all__"

要添加(附加信息),如果序列化程序属于您的class DocumentType,那么我们必须使用:many = True,示例在后续字段中

class DocumentTypeSerializer(serializers.ModelSerializer):
    # here we use related_name 'doc_title' for the relationship
    doc_title = serializers.StringRelatedField(many=True)

    class Meta:
        model = DocumentsType
        fields = "__all__"