Я хотел бы получить одно поле 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
Как сериализовать одно поле json из двух обратных отношений внешнего ключа в Django REST Framework? ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение