Вложенные сериализаторы Django не возвращают то, что я хочу

#python #django #django-rest-framework

Вопрос:

Я относительно новичок в 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 вместо этого запросить модель?

Если это имеет отношение к делу, в базе данных более 20 тыс. History записей-возможно ли, что Django «ленив» и не загружает данные? Действительно, я очень ценю любые советы.

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

Комментарии:

1. Привет, Лордан. Я думаю, что, возможно, проблема в ваших отношениях с объектами. Вы, вероятно, пытаетесь установить соотношение «Один ко многим» между пользователем и историей ? Потому что в этой вашей реализации я думаю, что максимум, который вы получите в сериализаторах, будет примерно таким: история: { …. пользователь: { … } }

2. И я не знаю, работает ли такая реализация вложенной сериализации. Обычно я создаю класс снаружи, а не вызываю, как вы делали в history = HistorySummarySerializer…

3. что вы имеете в виду, говоря о пустоте? ты имеешь в виду [1,2,3…]?

Ответ №1:

Ваше поле модели-это не то, что вы думаете. При создании отношения внешнего ключа, если вы не укажете related_name значение параметра, Django установит его по умолчанию {field_name}_set . Это означает, что если вы хотите получить историю для пользователя, вам придется сделать следующее:

 User.objects.get(pk=1).history_set.all()  

Ваш вложенный сериализатор ожидает, что история будет храниться в history поле, которого не существует.

Попробуйте добавить source=‘history_set’ во вложенное поле сериализатора