在 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 中查询外键数据的主要内容,如果未能解决你的问题,请参考以下文章

Django 查询集外键

在main函数中使用django模型(附django正反向的外键关联查询)

Django 外键查询

如何在Django中查询具有特定数量的外键关系并且在这些外键值中具有特定值的对象?

Django外键查询,为啥它返回None?

在django模板中按id的顺序显示查询集及其外键