Django将带有外键的查询集转换为JSON

时间:2019-02-20 16:44:13

标签: django django-templates django-views

我正在尝试将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)

2 个答案:

答案 0 :(得分:1)

这里我们有三个模型TodaysResultsForeignModelMModel,我猜想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))