#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’
во вложенное поле сериализатора