Django Преобразование Queryset с внешними ключами в JSON - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь передать объекты 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)

Я получаю следующую ошибку:

"Ошибка типа: 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) На основе нескольких ответов , подобных этому (с 2012 г.), которые были в том же духе, и я попытался:

    def for_JSON_response():
    response=JsonResponse(dict(results_info=list(TodaysResultslts.objects.values('id','foreignModel1__name',
    'foreignModel1__ForeignModel2__title')
    print(response)

Я не получил ни одногоошибки, но он ничего не печатает. Итак, я предполагаю, что ничего не произошло.

4) На основе это Я пытался:

 def my_queryset():
     results=TodaysResults.objects.values('id','foreignModel1__name',
    'foreignModel1__ForeignModel2__title')
    print (JsonResponse(results, safe=False))

Я получаю:

TypeError: Объект типа QuerySet не является JSONserializable

И я попробовал:

  def my_queryset():
     results=TodaysResults.objects.values('id','foreignModel1__name',
    'foreignModel1__ForeignModel2__title')
     results_json = serializers.serialize('json',results)

И я получил:

AttributeError: у объекта 'dict' нет атрибута '_meta'

Я много раз осматривался, и некоторые ответы выглядят устаревшими.Мои попытки, описанные выше, являются, как мне кажется, самыми близкими к преобразованию набора значений в 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 голосов
/ 21 февраля 2019

Этот ответ основан на (принятом) добром ответе Шакиля.

Я установил 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))
0 голосов
/ 20 февраля 2019

Здесь у нас есть три модели TodaysResults, ForeignModel и MModel, и я предполагаю, что MModel - это manyTomany отношение с 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')

Теперь передайте свой TodaysResults набор запросов TodaysResultsSerializer и из serializer.data вы получите ваши сериализованные данные.

Возможное решение Два

Даже мы можем сделать это с помощью одной сериализации, поскольку не все поля обязательны для заполнения.

class TodaysResultsSerializer(serializers.ModelSerializer):
    class Meta:
        model = TodaysResults
        fields = ('place', 'foreignModel1__name', 'foreignModel1__foreignModel2__title')

Хотя я не совсем уверен, но это также должно работать.

...