У меня вопрос о работе с моделями m2m / through и их представлении в рамках django rest. Возьмем классический пример:
models.py:
from django.db import models
class Member(models.Model):
name = models.CharField(max_length = 20)
groups = models.ManyToManyField('Group', through = 'Membership')
class Group(models.Model):
name = models.CharField(max_length = 20)
class Membership(models.Model):
member = models.ForeignKey('Member')
group = models.ForeignKey('Group')
join_date = models.DateTimeField()
serializers.py:
imports...
class MemberSerializer(ModelSerializer):
class Meta:
model = Member
class GroupSerializer(ModelSerializer):
class Meta:
model = Group
views.py:
imports...
class MemberViewSet(ModelViewSet):
queryset = Member.objects.all()
serializer_class = MemberSerializer
class GroupViewSet(ModelViewSet):
queryset = Group.objects.all()
serializer_class = GroupSerializer
При ПОЛУЧЕНИИ экземпляра члена я успешно получаю все поля члена, а также его группы, однако я получаю только данные о группах, без дополнительных деталей, которые поступают из модели членства.
Другими словами, я ожидаю получить:
{
'id' : 2,
'name' : 'some member',
'groups' : [
{
'id' : 55,
'name' : 'group 1'
'join_date' : 34151564
},
{
'id' : 56,
'name' : 'group 2'
'join_date' : 11200299
}
]
}
Обратите внимание на файл join_date .
Я перепробовал так много решений, включая, конечно, официальную страницу Django Rest-Framework об этом, и, похоже, никто не дает по этому поводу правильного простого ответа - что мне нужно сделать, чтобы включить эти дополнительные поля? Я нашел его более простым с django-вкусным пирогом, но у меня были другие проблемы, и я предпочитаю rest-framework.
Ответы:
Как насчет.....
В своем MemberSerializer определите на нем поле, например:
а затем в сериализаторе членства вы можете создать это:
Это имеет общий эффект создания сериализованных значений, групп, источником которых является желаемое членство, а затем он использует настраиваемый сериализатор для извлечения битов, которые вы хотите отобразить.
РЕДАКТИРОВАТЬ: как прокомментировал @bryanph,
serializers.field
был переименованserializers.ReadOnlyField
в DRF 3.0, поэтому это должно читаться:для любых современных реализаций
источник
membership_set
это связанное имя по умолчанию для Член -> ЧленствоЯ столкнулся с этой проблемой, и мое решение (с использованием DRF 3.6) заключалось в использовании SerializerMethodField для объекта и явном запросе таблицы членства следующим образом:
Это вернет список dict для ключа группы, где каждый dict сериализуется из MembershipSerializer. Чтобы сделать его доступным для записи, вы можете определить свой собственный метод создания / обновления внутри MemberSerializer, в котором вы перебираете входные данные и явно создаете или обновляете экземпляры модели членства.
источник
ПРИМЕЧАНИЕ. Как инженер-программист, я люблю использовать архитектуры, и я глубоко работал над многоуровневым подходом к разработке, поэтому я собираюсь отвечать на него в отношении уровней.
Насколько я понял проблему, вот решение models.py
serializers.py
CustomModels.py
BusinessLogic.py
Технически вам придется передать запрос в DataAccessLayer, который вернет отфильтрованные объекты из уровня доступа к данным, но поскольку мне нужно быстро ответить на вопрос, я скорректировал код на уровне бизнес-логики!
источник