Как сериализовать одно поле json из двух обратных отношений внешнего ключа в Django REST Framework?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как сериализовать одно поле json из двух обратных отношений внешнего ключа в Django REST Framework?

Сообщение Anonymous »

Я хотел бы получить одно поле json в ответе API, в котором перечислены идентификаторы связанных объектов на основе двух обратных отношений внешнего ключа. Простой пример того, что я имею в виду, представлен ниже. Я бы очень предпочел, чтобы это обрабатывалось на уровне сериализатора Django REST Framework, а не каким-то образом меняло модель, но у меня очень мало опыта DRF, и я не могу хоть убей понять, как это сделать на самом деле. это.
Пример models.py:
class Person(models.Model):

id = models.AutoField(primary_key=True)

first_name = models.CharField(max_length=50, blank=True, null=True)

last_name = models.CharField(max_length=50, blank=True, null=True)

father = models.ForeignKey(
"self",
related_name="children_as_father",
blank=True,
null=True,
on_delete=models.SET_NULL,
)

mother = models.ForeignKey(
"self",
related_name="children_as_mother",
blank=True,
null=True,
on_delete=models.SET_NULL,
)

Пример данных базы данных:

< thead>

id
первое_имя
фамилия
< th>мать
отец



1
Джейн
Смит




2
Джон
Смит




< td>3
Кларенс
Смит
1
2


4
Томас
Смит
1
2



Пример сериализованного json, который я хотел бы получить:
[
{
"pk": 1,
"first_name": "Jane",
"last_name": "Smith",
"mother": null,
"father": null,
"children": [
3,4
],
},
{
"pk": 2,
"first_name": "John",
"last_name": "Smith",
"mother": null,
"father": null,
"children": [
3,4
],
},
{
"pk": 3,
"first_name": "Clarence",
"last_name": "Smith",
"mother": 1,
"father": 2,
"children": [],
},
{
"pk": 4,
"first_name": "Thomas",
"last_name": "Smith",
"mother": 1,
"father": 2,
"children": [],
}
]


Это то, чего удалось достичь моим экспериментам, и, как вы можете видеть по сравнению с примером выше, это не совсем то, что я хочу - мне бы хотелось одно поле json для детей, а не два:
serializers.py
from rest_framework.serializers import ModelSerializer, PrimaryKeyRelatedField
from .models import Person

class FamilySerializer(ModelSerializer):

children_as_mother = PrimaryKeyRelatedField(
many=True, read_only=True, allow_null=True
)

children_as_father = PrimaryKeyRelatedField(
many=True, read_only=True, allow_null=True
)

class Meta:
model = Person
fields = [
"pk",
"first_name",
"last_name",
"mother",
"father",
"children_as_mother",
"children_as_father",
]

views.py
from rest_framework.permissions import IsAuthenticated
from rest_framework.viewsets import ModelViewSet
from .models import Person
from .serializers import FamilySerializer

class FamilyViewSet(ModelViewSet):
"""
API endpoint with family data
"""

queryset = Person.objects.all()
serializer_class = FamilySerializer
permission_classes = [IsAuthenticated]

Сериализованный json:
[
{
"pk": 1,
"first_name": "Jane",
"last_name": "Smith",
"mother": null,
"father": null,
"children_as_mother": [
3,4
],
"children_as_father": [],
},
{
"pk": 2,
"first_name": "John",
"last_name": "Smith",
"mother": null,
"father": null,
"children_as_mother": [],
"children_as_father": [
3,4
],
},
{
"pk": 3,
"first_name": "Clarence",
"last_name": "Smith",
"mother": 1,
"father": 2,
"children_as_mother": [],
"children_as_father": [],
},
{
"pk": 4,
"first_name": "Thomas",
"last_name": "Smith",
"mother": 1,
"father": 2,
"children_as_mother": [],
"children_as_father": [],
}
]



Подробнее здесь: https://stackoverflow.com/questions/791 ... ationships
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»