在Django中查询外键数据

时间:2017-08-01 17:10:02

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

我希望查询我的数据库并检索字段的所有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}]

1 个答案:

答案 0 :(得分: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>