Вернуть идентификаторы ManyToManyField при запросе модели в Django 2.1? - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть две очень простые модели:

class Person(models.Model):
    full_name = models.CharField(max_length=120)

class Event(models.Model):
    event_date = models.DateField()
    short_description = models.CharField(max_length=250)
    people_involved = models.ManyToManyField(
        Person, blank=True, related_name="people_involved"
    )

Я хочу вернуть все события, включая people_involved.

В views.py у меня есть следующее:

def alljson(request):
    events = Event.objects.values()
    return JsonResponse(list(events), safe=False)

Возвращает:

[
    {
        "id": 9, 
        "event_date": "2019-01-01", 
        "short_description": "New Year's Party", 
    }, 
...
]

Как включить people_involved ManyToManyField в этот ответ?

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Вы можете использовать model_to_dict следующим образом:

from django.forms.models import model_to_dict

e_list = []
p_list = []
events = Event.objects.all()
for e in events:
    e_list.append(model_to_dict(e, fields=['event_date', 'short_description']))
    for p in e.people_involved.all():
        p_list.append(model_to_dict(p, fields=['full_name']))   
data = {'events': e_list, 'people_involved': p_list}
return JsonResponse(data)

с model_to_dict включить или исключить определенное поле, если вы хотите:)

или

Вы можете использовать сериализаторы , например:

from django.core import serializers 

data = {}
events = Event.objects.all()
s_events = serializers.serialize("json", events)
data['events'] = s_events
for event in events:
    data['persons'] = serializers.serialize("json", event.people_involved.all())
return JsonResponse(data)
0 голосов
/ 06 февраля 2019

Один из возможных способов или, я думаю, лучший способ сделать это - использовать django-restframework-serlizers link .

Если вы не хотите использовать это, то, к сожалению, вам нужно вручную сгенерировать все ответы, их невозможно получить.Вы можете сделать это следующим образом

def alljson(request):
    events =[] 
    for event in Event.objects.values():
         response = {}
         response['id'] = event.id
         response['short_description'] = event.short_description
         response['event_date'] = event.event_date
         response['people_involved'] = list(event.people_involved.all())
         events.append(response)


    return JsonResponse(events, safe=False)
...