Вложенные сериализаторы Django не возвращают то, что я хочу
Я относительно новичок в Django и работаю над приложением, которое заставляет меня ломать голову. У меня есть две модели, определенные следующим образом:
class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(_('email address'), unique=True)
name = models.CharField(_('name'), max_length=50, blank=False)
surname = models.CharField(_('surname'), blank=True, max_length=50)
phone_number = models.CharField(validators=[phone_validator], max_length=16, blank=True)
class History(models.Model):
hist_id = models.AutoField(primary_key=True)
user = models.ForeignKey(
User,
on_delete=models.CASCADE
)
timestamp = models.DateTimeField(auto_now=False, auto_now_add=False)
actions = models.JSONField(default=dict)
traces = models.JSONField(default=dict)
Я хочу получить список всех пользователей, и для каждого пользователя мне нужны все History
объекты в виде списка. Вот View
, который я создал:
class HistoryQuery(ListAPIView):
serializer_class = HistorySerializer
def get_queryset(self):
return User.objects.all()
и вот serializer
, который я пытаюсь использовать:
class HistorySerializer(serializers.Serializer):
class HistorySummarySerializer(serializers.Serializer):
class Meta:
model = History
fields = ['hist_id', 'user']
history = HistorySummarySerializer(many=True, read_only=True)
class Meta:
model = User
fields = ['history']
При такой настройке я получаю массив с длиной, равной количеству пользователей, которые есть в моей базе данных, но каждый из его элементов пуст. Я не могу понять, что я делаю неправильно, поэтому любая помощь будет принята с благодарностью. Должен ли я изменить свою логику и запросить модель History
вместо этого?
Если это имеет значение, в базе данных около 20k+ History
записей - возможно ли, что Django "ленится" и не загружает данные? Действительно, любой совет будет очень признателен.
Возможно, мне следует уточнить, что я хотел бы агрегировать History
результаты за день для каждого пользователя, но мой текущий план состоит в том, чтобы идти по одному шагу за раз, поэтому я займусь этим, как только эта часть будет работать.
Поле вашей модели не то, что вы думаете. При создании отношения ForeignKey, если вы не указали кварг related_name
, Django по умолчанию задаст {field_name}_set
. Это означает, что если вы хотите получить историю для пользователя, вам придется сделать следующее:
User.objects.get(pk=1).history_set.all()
Ваш вложенный сериализатор ожидает, что история будет находиться в поле history
, которого не существует.
Попробуйте добавить source=‘history_set’
во вложенное поле сериализатора