我正在尝试将JSON对象传递给我的模板。我有一些无法修改的复杂关系。基于操作系统 帖子我尝试了不同的方法。我认为让我接近的是:
我创建了一个.values()查询集
def my_queryset():
results=TodaysResults.objects.values('id','foreignModel1__name',
'foreignModel1__ForeignModel2__title')
print (myquery_set)
my_queryset给了我所有我需要的值。因此,我尝试使用以下方法对其进行转换。 1)
def make_querydict():
results=TodaysResults.objects.values('id','foreignModel1__name',
'foreignModel1__ForeignModel2__title')
json_results=json.dumps(list(results,cls=DjangoJSONEncoder))
print (json_results)
我收到以下错误:
“ TypeError:list()不包含关键字参数”
2)我也尝试过:
def serialize():
fields = ['id','foreignModel1__name','foreignModel1__ForeignModel2__title']
qs = TodaysResults.objects.all()
json_data = serializers.serialize('json',qs,fields=fields)
print(json_data)
但是当我打印json_data时,仅显示id而不显示外部值。
3)基于like this(2012年以来)的相同答案,我尝试过:
def for_JSON_response():
response=JsonResponse(dict(results_info=list(TodaysResultslts.objects.values('id','foreignModel1__name',
'foreignModel1__ForeignModel2__title')
print(response)
我没有收到任何错误,但是它没有打印任何内容。因此,我假设没有任何反应。
4)我基于this进行了尝试:
def my_queryset():
results=TodaysResults.objects.values('id','foreignModel1__name',
'foreignModel1__ForeignModel2__title')
print (JsonResponse(results, safe=False))
我得到:
TypeError:QuerySet类型的对象不可JSON序列化
我尝试过:
def my_queryset():
results=TodaysResults.objects.values('id','foreignModel1__name',
'foreignModel1__ForeignModel2__title')
results_json = serializers.serialize('json',results)
我得到了:
AttributeError:“ dict”对象没有属性“ _meta”
我一直到处逛逛,有些回复似乎已经过时了。我上面的尝试是我认为最接近转换 valuesqueryset设置为json或将我需要的值转换为JSON。有没有办法像我在my_queryset中进行的那样进行链接查询并将其转换为JSON?
Models.Py 此示例已简化
class TodaysResults(models.Model):
place = models.CharField(max_length=255)
ForeignModel1 = models.ForeignKey(ForeignModel,related_name='m1')
class ForeignModel(models.Model):
name = Models.CharField(max_length=255)
ForeignModel2 = models.ManyToManyField(M2M, related_name='m2')
class M2M(models.Model):
title = Models.CharField(max_length=255)
答案 0 :(得分:1)
这里我们有三个模型TodaysResults
,ForeignModel
和MModel
,我猜想MModel
是与manyTomany
的{{1}}关系。我提出了两种可能的方式来从ForeignModel
序列化程序中获取所有信息。
TodaysResults
现在通过您的from rest_framework import serializers
class MModelSerializer(serializers.ModelSerializer):
class Meta:
model = MModel
fields = ('title',)
class ForeignModelSerializer(serializers.ModelSerializer):
foreignModel2 = MModelSerializer(many=True) # as it is many to many field
class Meta:
model = ForeignModel
fields = ('name', 'foreignModel2',)
class TodaysResultsSerializer(serializers.ModelSerializer):
foreignModel1 = ForeignModelSerializer()
class Meta:
model = TodaysResults
fields = ('place', 'foreignModel1')
查询集TodaysResultsSerializer,并从serializer.data中获取序列化的数据。
即使我们不需要一个字段,也可以使用一个序列化来完成。
TodaysResults
尽管我不确定,但这也可以。
答案 1 :(得分:0)
此答案建立在Shakil的(可接受的)回应上。
我点安装了djangorestframework。我将其添加到"INSTALLED_APPS = [ 'rest_framework',...]
中,然后在我的应用中创建了serializers.py文件。在导入的serializers.py中
from rest_framework import serializers
from .models import *
然后,我按照@Shakil的说明创建了所有序列化器,但是不得不添加一些内容,因此我在此处添加了新答案:
class MModelSerializer(serializers.ModelSerializer):
class Meta:
model = MModel
fields = ('title',)
class ForeignModelSerializer(serializers.ModelSerializer):
foreignModel2 = MModelSerializer(many=True) # as it is many to many field
class Meta:
model = ForeignModel
fields = ('name', 'foreignModel2',)
class TodaysResultsSerializer(serializers.ModelSerializer):
foreignModel1 = ForeignModelSerializer()
'name' = serializers.RelatedField(source='ForeignModel', read_only=True) #this gives me the 'name' on the ForeignModel not just the id
class Meta:
model = TodaysResults
fields = ('place', 'foreignModel')
depth = 3 #this is what allows you to go from TodaysResults to Foreign Model and then to MModel to grab 'title'.
然后转到views.py并导入:
from rest_framework import serializers
from .serializers import *
from .models import *
然后我创建了这个函数:
all_results=TodaysResults.objects.all()
serializer = SearchResultsSerializer(all_results, many=True)
ok = serializer.data
print(json.dumps(ok, indent=4, sort_keys=True))