Django:如何将数据库中的数据以及外键实体作为 JSON 返回给用户



>我有两个这样的模型,

class Foo(models.Model):
    name = models.CharField(max_length=100, unique=True)
    city = models.CharField(max_length= 50)
    ....

class Bar(models.Model):
    Foo = models.ManyToManyField(Foo)
    name = models.CharField(max_length=20, unique=True)

我有一个将 Foo 对象作为 JSON 返回的视图,

def list_by_city(request, city):
    foo_list = Foo.objects.filter(city=city).values()
    return JsonResponse({"Foo": list(foo_list)})

但这只返回来自 Foo 的属性。我还想添加来自 Bar 的属性,这些属性与 Foo 相关。我该怎么做?

编辑:生成的JSON应该有点像,

{
   "Foo":[
      {
         "id":1,
         "name":"A",
         "city":"B",
         "Bars":[
            {
               "name":"A"
            },
            {
               "name":"B"
            }
         ]
      },
      {
         "id":2,
         "name":"C",
         "city":"B",
         "Bars":[
            {
               "name":"D"
            }
         ]
      }
   ]
}

您可以只使用 Django Rest Framework 的序列化组件。它提供了一个声明性序列化程序,该序列化程序比 Django 中的序列化程序更灵活。

models.py

class Bar(models.Model):
    foo = models.ManyToManyField(Foo, related_name='bars')
    name = models.CharField(max_length=20, unique=True)

serializers.py

from rest_framework import serializers
from .models import Foo, Bar

class BarSerializer(serializers.ModelSerializer):
    class Meta:
        model = Bar
        fields = ('name',)

class FooSerializer(serializers.ModelSerializer):
    bars = BarSerializer(many=True, read_only=True)
    class Meta:
        model = Foo
        fields = ('name', 'city', 'bars')

这导致:

>>> s = FooSerializer(my_foo_object)
>>> s.data
{'bars': [OrderedDict([('name', 'B')]), OrderedDict([('name', 'A')])], 'city': 'Bangkok', 'name': 'Foo'}

要序列化查询集或对象列表,您可以执行FooSerializer(Foo.objects.all(), many=True)

您可以使用以下内容将另一个项目添加到视图中的字典中:

 def list_by_city(request, city):
        response_data = {}
        response_data['foo_list'] = Foo.objects.filter(city=city).values()
        response_data['bar_list'] = Foo.objects.filter(country=country).values()
        return JsonResponse(json.dumps(response_data))

最新更新