我试图获取外键的值,但是我只得到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和标题
答案 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__"