>我有两个这样的模型,
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))