在 Django 中查询外键数据
Posted
技术标签:
【中文标题】在 Django 中查询外键数据【英文标题】:Querying Foreign keys data in Django 【发布时间】:2017-08-01 17:10:02 【问题描述】:我正在查询我的数据库并检索字段的所有 REAL 值。 相反,我得到了外键 id 值。 有人可以帮忙吗?
这是我的models.py:
class Respondant(models.Model):
Respond_Id = models.IntegerField(null=True)
Gender = models.TextField(null=True)
Age = models.TextField(null=True)
Country = models.ForeignKey(Country, related_name="respondant_Country")
Theme = models.ForeignKey(Question, related_name="respondant_Theme")
Question = models.ForeignKey(Question, related_name="respondant_Question")
def __str__(self):
return " Respondant: ".format(self.Respond_Id)
RespondantSerializer:
class RespondantSerializer (serializers.ModelSerializer):
class Meta:
model = Respondant
fields=('Respond_Id' ,'Gender' , 'Age', 'Answer')
我在 api.py 中设置的查询:
class Theme1Api(ListAPIView):
queryset = Respondant.objects.filter(Theme=1)
serializer_class = RespondantSerializer
name = 'theme1'
def get_queryset(self, *args, **kwargs):
Country = self.kwargs['Country']
Question = self.kwargs['Question']
return Respondant.objects.filter(Theme=1).filter(Question=Question).filter(Country=Country)
这是一个输出:
["Respond_Id": 258, "Gender": "Female", "Age": "18-21", "Answer": 424,
"Respond_Id": 258, "Gender": "Female", "Age": "18-21", "Answer": 428]
【问题讨论】:
我想你在你的 json 响应中想要国家、主题和问题?RespondantSerializer
长什么样子?
感谢您的回答。不,我想要回答真实值而不是 id。我在上面添加了 RespondantSerializer。
【参考方案1】:
由于您使用的是ModelSerializer
,因此您可以使用depth
选项来获取关系的嵌套表示。
class RespondantSerializer (serializers.ModelSerializer):
class Meta:
model = Respondant
fields=('Respond_Id' ,'Gender' , 'Age', 'Answer')
depth = 1
更多详情在这里http://www.django-rest-framework.org/api-guide/serializers/#specifying-nested-serialization
如果您想对其进行更多控制,您可以创建一个 AnswerSerializer
并改用它
class RespondantSerializer (serializers.ModelSerializer):
Answer = AnswerSerializer()
class Meta:
model = Respondant
fields=('Respond_Id' ,'Gender' , 'Age', 'Answer')
或者,如果您只想要来自 Answer
对象的值,您可以使用 SerializerMethodField
,更多信息在这里 http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield
class RespondantSerializer (serializers.ModelSerializer):
Answer = SerializerMethodField()
class Meta:
model = Respondant
fields=('Respond_Id' ,'Gender' , 'Age', 'Answer')
def get_Answer(self, obj):
# get your value from obj.Answer
return obj.Answer.<your_value>
【讨论】:
以上是关于在 Django 中查询外键数据的主要内容,如果未能解决你的问题,请参考以下文章
在main函数中使用django模型(附django正反向的外键关联查询)